2012-11-09 82 views
6

我在嘗試在基礎對象上利用Object.defineProperty()時遇到掛斷。我想從該對象繼承屬性,使用Object.create(),然後在派生對象中定義更多屬性(可能從此繼承)。我應該注意到,我正在node.js上實現這個目標。爲什麼console.log()不顯示Object.create的繼承屬性?

下面是一個例子:

var Base = {}; 

Object.defineProperty(Base, 'prop1', { 
    enumerable:true, 
    get:function(){ return 'prop1 value';} 
}); 

Object.defineProperty(Base, 'prop2', { 
    enumerable:true, 
    value : 'prop 2 value' 
}); 

Object.defineProperty(Base, 'create', { 
    value:function(){ 
     return Object.create(Base); 
    } 
}); 

console.log(Base); 

var derived = Base.create(); 

Object.defineProperty(derived, 'prop3', { 
    enumerable:true, 
    value:'prop 3 value' 
}); 

console.log(derived); 

哪個輸出以下:

{ prop1: [Getter], prop2: 'prop 2 value' } 
{ prop3: 'prop 3 value' } 

我認爲的console.log()將枚舉繼承的屬性,以及我定義的屬性prop3在派生的對象上。看起來它不會查找以這種方式定義的屬性的原型層次結構。那是對的嗎?

我看着重寫了我的對象的toString()方法,但似乎console.log()不會調用它。

  1. 如何獲取記錄的所有屬性,而不必通過它們進行枚舉?
  2. 這是實現繼承的有效方法嗎?

編輯:

  1. 是否有node.js的圖書館其他功能,將做的工作和日誌繼承屬性?
+1

對於懶:http://jsfiddle.net/ aDrjA/1/ –

+1

對於初學者來說,'console'的實現是針對瀏覽器的。你真的不能依靠它來運行瀏覽器,因爲每個供應商都在做與非標準完全不同的事情。當你在Chrome開發工具中使用console.log(object)的時候,你會得到一個可擴展的節點樹,它擁有所有的方法和屬性,並且還有'proto'鏈,它具有完整的繼承棧......在每個瀏覽器中都會遇到這種情況 - 即使看到「window.console」,某些瀏覽器(WP7 IE9)中的程序也會崩潰,因爲它們甚至沒有實現。 – Norguard

+1

***「我應該注意到我正在使用node.js。」*** –

回答

1

螢火蟲確實登錄繼承的屬性:

enter image description here

,而Chrome瀏覽器爲您提供了一個樹視圖,其中包括繼承屬性:

enter image description here

+0

@dwerner Chrome提供了一個樹形視圖。 'console.log'是特定於實現的。看來Node.js決定只記錄自己的屬性。當然,這並不意味着該對象不會繼承其他兩個屬性。 –

4

可以使用console.dir()如有可用

console.dir(derived) 

,它會顯示__proto__對象

編輯對你對象的繼承屬性:似乎沒有出現在節點雖然

+0

也很高興知道有關console.dir()的感謝。我只是不確定我想依靠'__proto__'。 – dwerner

相關問題