2011-03-25 77 views
0

來自John Resigs的示例#81高級JavaScript,名爲「當心:擴展原型可以危險」.http://ejohn.org/apps/learn/#81 As它被寫入(長度== 3),斷言失敗,但是如果你斷言obj.keys().length == 4它通過。JavaScript擴展原型#81來自John Resig學習高級JavaScript

這裏有一些問題

1)爲什麼他說:「我們應該只有3個屬性」?有4個物業出乎意料或令人失望?

2)它如何獲得4個屬性?

3)什麼是var i在程序的第三行?

4)第三行中的this是否指對象?

5)看看斷言,這個代碼obj.keys().length在第一行調用函數嗎?如果在obj.keys()。length中有4個屬性,返回的數組var key中是否還有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)第四項是在Object剛定義的keys()函數。

3)var i只是一個循環變量。

4)this指的是函數被調用的任何對象。所以如果你撥打a.keys(),那麼thisa

5)是的。

6)是—但由於它是一個本地數組,所以一旦它返回,它就超出了範圍,所以只有在返回值被賦值給調用函數中的另一個變量時才能被訪問。