JavaScript扩展原型#81来自John Resig学习高级JavaScript

时间:2011-03-25 05:14:39

标签: javascript

来自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;

1 个答案:

答案 0 :(得分:1)

1)在查看初始化程序时,期望新的新对象只具有已分配给它的属性是合理的。合理但错误。在javascript中,原型链使对象“继承”未在每个实例上初始化的属性。

2)第四项是keys()上刚刚定义的Object函数。

3)var i只是一个循环变量。

4)this指的是调用函数的任何对象。因此,如果您致电a.keys(),则thisa

5)是的。

6)是 - 但由于它是一个本地数组,一旦返回它就超出了范围,所以只有在返回值被分配给调用函数中的另一个变量时才能访问它。