Javascript propertyIsEnumerable返回false但仍然可枚举

时间:2014-10-27 02:28:59

标签: javascript

根据MDN

  

propertyIsEnumerable()方法返回一个布尔值,指示指定的属性是否可枚举

但是当我运行以下代码时,它会输出:

  

方法信息不可枚举
  但可以在for循环中看到

var Person = function(name){
  this.name = name;
};

Person.prototype.info = function(){
  console.log("Name =", this.name);
};

var me = new Person('Mike');
console.log('method info is' + (me.propertyIsEnumerable('info') ? '' : ' NOT') + ' enumerable');
for(var k in me) {
  if (k == 'info') {
    console.error('but can be seen in for loop')
  }
}

这让我很困惑。


更新

正如@RobG所回答的那样,由于propertyIsEnumerable只检查对象本身的属性,如果我只想在对象上迭代属性,我该怎么办?

1 个答案:

答案 0 :(得分:3)

propertyIsEnumerable仅检查对象本身的属性,它不考虑原型链。所以:

me.propertyIsEnumerable('info')

返回false,因为 me 上没有 info 属性,它位于 Person.prototype 上。它显示在 for 循环中,因为它将迭代 me 的所有属性,包括从其构造函数原型继承的那些属性。

由于这种行为, propertyIsEnumerable 在早期版本的Safari中用作 hasOwnProperty 的替代品,其中 hasOwnProperty 有错误或不存在(我无法记住哪一个)。

相关问题