2012-11-09 10 views
6

Uruchamiam się podczas próby użycia Object.defineProperty() na obiekcie podstawowym. Chcę dziedziczyć właściwości z tego obiektu, używając Object.create(), a następnie zdefiniować więcej właściwości w obiekcie pochodnym (który może być dziedziczony z tego obiektu). Powinienem zauważyć, że celuję w to w node.js.Dlaczego program console.log() nie wyświetla odziedziczonych właściwości z obiektu Object.create?

Oto przykład:

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

Która wyprowadza następujące:

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

myślałem, że console.log() byłoby wyliczyć odziedziczone właściwości, a także właściwość prop3 że określony na obiekcie pochodnym. Wydaje się, że nie wyszukuje hierarchii prototypów dla właściwości zdefiniowanych w ten sposób. Czy to jest poprawne?

Spojrzałem na przesłonięcie metody toString() dla mojego obiektu, ale wygląda na to, że console.log() tego nie nazywa.

  1. Jak mogę uzyskać dostęp do wszystkich właściwości bez konieczności ich wyliczania?
  2. Czy jest to ważny sposób na wdrożenie dziedziczenia?

EDIT:

  1. Czy istnieje inna funkcja w bibliotekach node.js', która wykona pracę i zalogować odziedziczone właściwości?
+1

dla leniwych: http://jsfiddle.net/ aDrjA/1/ –

+1

Na początek implementacja 'console' jest specyficzna dla przeglądarki. Naprawdę nie można polegać na tym, aby zachowywać się w ten sam sposób, z przeglądarką do przeglądarki, ponieważ każdy sprzedawca robi coś zupełnie innego z niestandardowym. Kiedy "console.log (object);" w narzędziach deweloperskich Chrome otrzymujesz rozszerzalne drzewo węzłów, które ma wszystkie posiadane metody i właściwości, a także ma łańcuch 'proto', który ma pełny pakiet dziedziczenia ... Oczekiwanie na to w każdej przeglądarce nie nastąpi - programy w niektórych przeglądarkach (WP7 IE9) ulegną awarii, jeśli zobaczą nawet "window.console", ponieważ nie mają nawet implementacji. – Norguard

+1

*** "Należy zauważyć, że celuję w to w węźle node.js." *** –

Odpowiedz

1

Firebug robi zalogować odziedziczone właściwości:

enter image description here

podczas Chrome daje widoku drzewa, który zawiera odziedziczone właściwości:

enter image description here

+0

@dwerner Chrome zapewnia widok drzewa. 'console.log' jest specyficzne dla implementacji. Wygląda na to, że Node.js postanowił zalogować tylko własne właściwości.Oczywiście nie oznacza to, że obiekt nie dziedziczy pozostałych dwóch właściwości. –

4

można użyć console.dir() gdzie dostępne

console.dir(derived) 

i będzie to pokazać odziedziczone właściwości swojego obiektu na obiekt __proto__

Edit: nie robi wydaje się, aby pokazać się na węźle chociaż

+0

Dobrze jest również wiedzieć o dziękach konsolowych. Po prostu nie jestem pewien, czy chcę polegać na "__proto__". – dwerner

Powiązane problemy