2012-11-09 15 views
6

Ich renne in einen Hangup, während ich versuche, Object.defineProperty() für ein Basisobjekt zu nutzen. Ich möchte Eigenschaften von diesem Objekt mit Object.create() erben und dann weitere Eigenschaften im abgeleiteten Objekt definieren (die von dort vererbt werden können). Ich sollte beachten, dass ich dies auf node.js anvisiere.Warum zeigt console.log() keine geerbten Eigenschaften von Object.create an?

Hier ist ein Beispiel:

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); 

, die die folgenden Ausgänge:

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

Ich dachte, dass console.log(), um die vererbten Eigenschaften, sowie die Eigenschaft prop3, die ich definiert würde aufzählen auf das abgeleitete Objekt. Es scheint, dass die Prototyphierarchie für auf diese Weise definierte Eigenschaften nicht nachgeschlagen wird. Ist das korrekt?

Ich schaute auf die toString() Methode für mein Objekt überschreiben, aber es scheint, dass console.log() das nicht aufrufen.

  1. Wie kann ich alle Eigenschaften protokolliert bekommen, ohne sie aufzählen zu müssen?
  2. Ist dies ein gültiger Weg, die Vererbung zu implementieren?

EDIT:

  1. Gibt es eine andere Funktion in node.js' Bibliotheken, die die Arbeit machen würde und die vererbten Eigenschaften anmelden?
+1

Für die Faulen: http://jsfiddle.net/ aDrjA/1/ –

+1

Zunächst einmal ist die Implementierung von 'console' browserspezifisch. Man kann sich wirklich nicht darauf verlassen, dass es sich so verhält, von Browser zu Browser, da jeder Anbieter etwas völlig anderes mit dem Nicht-Standard macht. Wenn Sie in den Chrome-Dev-Tools "console.log (object);" angeben, erhalten Sie eine erweiterbare Knotenstruktur, die alle zugehörigen Methoden und Eigenschaften sowie die "Proto" -Kette mit dem vollständigen Vererbungsstapel enthält ... Das in jedem Browser zu erwarten, wird nicht passieren - Programme in einigen Browsern (WP7 IE9) werden abstürzen, wenn sie 'window.console' sogar sehen, da sie nicht einmal Implementierungen haben. – Norguard

+1

*** "Ich sollte beachten, dass ich dies auf node.js zielen." *** –

Antwort

1

Firebug tut die vererbten Eigenschaften log:

enter image description here

während Chrome gibt Ihnen eine Baumansicht, die die vererbten Eigenschaften beinhaltet:

enter image description here

+0

@dwerner Chrome bietet eine Baumansicht. 'console.log' ist implementierungsspezifisch. Es scheint, dass Node.js entschieden hat, nur eigene Eigenschaften zu protokollieren.Das bedeutet natürlich nicht, dass das Objekt die anderen beiden Eigenschaften nicht erbt. –

4

Sie verwenden können, console.dir() wo verfügbar

console.dir(derived) 

und es werden die vererbten Eigenschaften des Objekts auf dem __proto__ Objekt

Bearbeiten zeigen: scheint nicht auf dem Knoten zu zeigen, obwohl

+0

Es ist auch gut, über console.dir() Danke zu wissen. Ich bin mir nicht sicher, ob ich mich auf "__proto__" verlassen will. – dwerner

Verwandte Themen