2011-03-25 9 views
0

これは、John Resigs Learning Advanced JavaScriptからの例です。注意:プロトタイプを拡張することは危険です.http://ejohn.org/apps/learn/#81 As書かれています(長さ== 3)。アサートは失敗しますが、obj.keys().length == 4がアサートされていれば成功します。JavaScript拡張プロトタイプ#81 John Resigからの高度なJavaScriptの学習

ここ

1)なぜ彼は「我々は唯一の3つの特性を有するべきである」と言っているいくつかの質問がありますか?どのような方法でそれは予期しなかったか、または4つのプロパティを持つことには残念ですか?

2)どのように4つのプロパティを取得しますか?

3)プログラムの3行目にはvar iとは何ですか。

4)3行目のthisは、オブジェクトを参照していますか?

5)アサルトを見ると、このコードobj.keys().lengthは最初の行で関数を呼び出しますか?

6)obj.keys()。lengthに4つのプロパティがある場合、返された配列のvarキーに4つの要素がありますか?

Object.prototype.keys = function(){ 
    var keys = []; 
    for (var i in this) 
    keys.push(i); 
    return keys; 
}; 

var obj = { a: 1, b: 2, c: 3 }; 

assert(obj.keys().length == 3, "We should only have 3 properties."); 

delete Object.prototype.keys; 

答えて

1

1)これは、新鮮な新しいオブジェクトが唯一あなたがそれに割り当てた性質を持っているだろうと期待するのは、初期化子を見て、合理的です。妥当だが間違っている。 javascriptでは、プロトタイプチェーンにより、オブジェクトは各インスタンスで初期化されないプロパティを「継承」します。

2)4番目の項目は、Objectで定義されたkeys()関数です。

3)var iは単なるループ変数です。

4)thisは、関数が呼び出されているオブジェクトを表します。だからa.keys()に電話すると、thisaになります。

5)はい。

6)はい—しかし、それはローカル配列であるため、一度返されると範囲外です。したがって、戻り値が呼び出し関数内の別の変数に割り当てられている場合にのみアクセスできます。

関連する問題