2012-07-27 67 views
0

我想知道以下幾點。 給予這個代碼:被列舉不明財產影響的房產?

function displayprops(obj, name) { 
    console.log(name+":"); 
    for(var prop in obj) 
     console.log(prop + ": " + obj[prop]); 
} 

var first = {prop: {}}; 
displayprops(first, "first"); // "prop: [object Object]" 

var second = Object.create(first); 
Object.defineProperty(second,"prop",{ 
    enumerable:false 
}); 
displayprops(second, "second"); // "prop: undefined" 

Demo at jsbin

first創建的所有對象都應該很明顯onherit的 prop財產。

但是爲什麼從second創建的對象在迭代時仍然在其屬性中顯示prop,請注意其值爲undefined

我預計枚舉描述符設置爲false時,從該原型繼承的對象,不應該表現出這些屬性更多的

編輯: 當我延長Object.prototype中(無論何種原因)有一種方法 和枚舉描述符設置方法爲假 它的行爲與預期

有人能解釋這一點,也許在錯誤的方向即時通訊想着

Thx答案=)

+0

在一個說明中,我只想指出,給定名稱「proto」和(壞)用法「__proto__」(假設你自己沒有混合這兩個)會引起很多混淆,我會建議命名它不那麼令人困惑。另外請注意,prototype是構造函數的一個方法(Object.prototype是Object()函數的一個方法,它構造新的對象(使用新的Object()或者簡單地)只使用Object.create創建基於對象的繼承創建一個對象的擴展 – 2012-07-27 14:17:20

+0

不能重現,[這個簡單得多的代碼](http://jsbin.com/oqevam/4/edit)怎麼樣,它是否顯示出相同的行爲(或者是我的抽象錯誤) ? – Bergi 2012-07-27 14:17:58

+0

是的,它顯示了相同的行爲(至少在使用Chrome時) 我第一次注意到鈦的這種行爲 – C5H8NNaO4 2012-07-27 14:19:32

回答

2

這是V8 JavaScript引擎中的一個錯誤。我以前遇到過。即使被不可枚舉的屬性所影響,也會包含原型鏈中的枚舉屬性。

已經有一個錯誤報告。 如果我能再找到它,我會在這裏發佈。這...

Issue 705: Non-enumerable property fails to shadow inherited enumerable property from for-in

在Firefox中測試它,你會得到預期的結果。

+0

Thx =)這似乎是問題, 嗯,現在我只需要讓鈦使用其他JavaScript引擎^^ – C5H8NNaO4 2012-07-27 14:24:59

+0

@Glutamat:不客氣......並祝你好運。 :) – 2012-07-27 14:26:11

+0

@Glutamat:你能告訴我們的用例是你需要這種行爲嗎?只是好奇。 – Bergi 2012-07-27 16:39:47