来自John Resigs学习高级JavaScript的示例#81,称为Beware:Extending Prototypes可能是危险的.http://ejohn.org/apps/learn/#81正如它所写的(长度== 3), assert失败,但如果你断言obj.keys().length == 4
它就会通过。
以下是一些问题
1)他为什么说“我们应该只有3个属性”?有4个属性是出乎意料或令人失望的?
2)它如何获得4个属性?
3)程序第三行的var i
是什么?
4)第三行中的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;
答案 0 :(得分:1)
1)在查看初始化程序时,期望新的新对象只具有已分配给它的属性是合理的。合理但错误。在javascript中,原型链使对象“继承”未在每个实例上初始化的属性。
2)第四项是keys()
上刚刚定义的Object
函数。
3)var i
只是一个循环变量。
4)this
指的是调用函数的任何对象。因此,如果您致电a.keys()
,则this
为a
。
5)是的。
6)是 - 但由于它是一个本地数组,一旦返回它就超出了范围,所以只有在返回值被分配给调用函数中的另一个变量时才能访问它。