2014-11-23 44 views
4

让我们创建一个新的对象:为什么“for-in”循环不会遍历原型属性?

var dict = {}; 

众所周知的事实是,创建一个新的对象之后,这个新对象继承了Object.prototype。所以当我试图检查原型的属性是否被继承时,我做了"toString" in obj,对此我得到了true。但是当我想将新创建的对象的所有属性放入一个数组中时,我会在填满后看到数组为空。看看下面的代码:

var names = []; 

for (var name in dict) { 
    names.push(name); 
}; 
names.length; 

不明白为什么会发生。

+5

因为它们不是可枚举的。 – elclanrs 2014-11-23 19:08:41

+1

并非所有属性都是可枚举的(您可以使用属性描述符自己创建不可枚举的属性)。这意味着您可以通过名称访问它们,但不会列出它们。 – slezica 2014-11-23 19:08:43

+0

这里是一个证明链接:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in – 2014-11-23 19:25:37

回答

2

正如很多评论中所说的,For-In循环仅枚举原型链中的枚举属性,并且继承的toString属性不是可枚举的。

如果你想通过object原型的非枚举的属性进行迭代,看看“的ToString”是存在的,那么你应该得到的对象原型,并使用getOwnPropertyNames方法获取其枚举和不可枚举的属性:

var dict = {}; 
var objPrototype = Object.getPrototypeOf(dict); 

var propertyNames = Object.getOwnPropertyNames(objPrototype); 

propertyNames.length; 
+2

或者'var names = Object.getOwnPropertyNames(objPrototype) - 忘记OP的循环 - 它只是混淆了这个问题。 – Alnitak 2014-11-24 00:13:13

+0

正确:)我甚至没有看..其晚,我应该去睡觉! – 2014-11-24 00:13:33