Kanasan.JS CodeReading #3
2008-02-08


Prototype.js では、プライベートなプロパティ、メソッドの名前はアンダースコア (_) から始まるようにしている。これは JavaScript の言語仕様によるものではないが、このようなコーディング規約を採用するところは多い (ぜんぜん見ないという声も)。

Ajax.Response#_getResponseJSON

HTTP ヘッダのフィールド名は大文字小文字を区別しない (RFC 2616 4.2)。XMLHttpRequest オブジェクトの getResponseHeader メソッドの引数として "Content-Type" を渡しても "Content-type" を渡しても、XMLHttpRequest オブジェクトが内部で同様に扱ってくれるはず。

if 文の条件節のインデントが不ぞろいで読みにくいという話から演算子の優先順位の話へ。論理和 (||) よりも論理積 (&&) のほうが優先順位が高い。この簡単な覚え方として、「和 (= 加算、+)」よりも「積 (= 乗算、*)」のほうが優先順位が高いのと同じというものがある。ビット和 (|) とビット積 (&) に関しても同様。最初、論理和演算子と論理積演算子の優先順位は同じと勘違いしていたのだが、そういう言語って何かあったっけ?

Node

Firefox や Opera、Safari 3 以降では、DOM 3 Core ECMAScript Language Binding に従って、Node コンストラクタ関数を提供している。Node コンストラクタ関数は Node インターフェースで定義された定数をプロパティとして持つ。

Node.ELEMENT_NODE; // => 1
Node.DOCUMENT_NODE; // => 3
document.nodeType == Node.DOCUMENT_NODE; // => true

Prototype.js では、IE でもこれらの定数が利用できるよう、Node コンストラクタ関数が存在しない場合は、新規オブジェクトを作成して Window オブジェクトの Node プロパティ (グローバル変数 Node) に設定している。

なお、Node コンストラクタ関数とはいっても、関数として呼び出したり、new 演算子とともにコンストラクタとして用いることはできない。ただし、Firefox や Opera、Safari 3 以降では、Node.prototype の値に変更を加えることで、Node インターフェースを実装するオブジェクトのプロパティ、メソッドを変更することができる。

Node.prototype.foo = 42;
Node.prototype.bar = function () { return this.nodeName; };
document.foo; // => 42
document.bar(); // => #document
// Document インターフェースは Node インターフェースを
// 継承しているので、document オブジェクトは
// Node インターフェースを実装しているといえる。

Element

Node と同じく、ブラウザによっては DOM Core の Element インターフェースに対して Element コンストラクタ関数 (ただし関数呼び出し、コンストラクタ呼び出しはできない) を提供している。しかし、Prototype.js では、Element をコンストラクタとして扱えるようにするため、Window オブジェクトの Element プロパティ (グローバル変数 Element) の値を書き換えている。その際、元の Element コンストラクタ関数のプロパティをそのまま扱えるようにするため、元の Element コンストラクタ関数を一時変数 element に退避している。

// Prototype.js 1.6.0.2 ll. 1546-1561
(function() {
  // ここで元の Element コンストラクタ関数の値を退避。
  var element = this.Element;

  // Element プロパティの値に関数を設定することで、
  // Element コンストラクタとして使えるようにする。
  this.Element = function(tagName, attributes) {
    ...
    // ここで、Element.cache の Element は
    // Element プロパティに新しく設定された無名関数。
    // グローバル変数 Element とはグローバルオブジェクト
    // (ブラウザ上では Window オブジェクト) の
    // Element プロパティのことであり、この関数内の
    // コードが実行される時点で Element プロパティの
    // 値は既に無名関数に書き換えられているため。
    var cache = Element.cache;
    ...
  };
  // 元の Element コンストラクタ関数のプロパティを、
  // 新たな Element コンストラクタ上でも使えるようにする。
  Object.extend(this.Element, element || { });
}).call(window);


続きを読む
戻る
[JavaScript]
[Web 関連技術]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット