2014-11-23 39 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