2012-11-09 21 views
6

Si è verificato un problema durante il tentativo di sfruttare Object.defineProperty() su un oggetto di base. Voglio ereditare le proprietà da quell'oggetto, usando Object.create() e quindi definire più proprietà nell'oggetto derivato (che può essere ereditato da lì). Devo notare che sto pensando a questo su node.js.Perché console.log() non mostra proprietà ereditate da Object.create?

Ecco un esempio:

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

che emette il seguente:

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

ho pensato che console.log() sarebbe enumerare le proprietà ereditate, così come la proprietà prop3 che ho definito sull'oggetto derivato. Sembrerebbe che non cerchi la gerarchia del prototipo per le proprietà definite in questo modo. È corretto?

Ho cercato di ignorare il metodo toString() per il mio oggetto, ma sembra che console.log() non lo chiami.

  1. Come posso ottenere tutte le proprietà registrate senza dover eseguire l'enumerazione?
  2. È un modo valido per implementare l'ereditarietà?

EDIT:

  1. C'è un'altra funzione nelle librerie Node.JS' che avrebbe fatto il lavoro e registrare le proprietà ereditate?
+1

Per i più pigri: http://jsfiddle.net/ aDrjA/1/ –

+1

Per i principianti, l'implementazione di 'console' è specifica per il browser. Non puoi davvero fare affidamento su di esso per comportarti allo stesso modo, browser per browser, poiché ogni fornitore sta facendo qualcosa di completamente diverso con il non standard. Quando si 'console.log (oggetto);' in Chrome-tools, si ottiene un albero-nodo espandibile, che ha tutti i metodi e le proprietà di proprietà, e ha anche la catena 'proto', che ha lo stack di ereditarietà completo ... Aspettarsi questo in ogni browser non accadrà - i programmi in alcuni browser (WP7 IE9) si arresteranno in modo anomalo se vedranno anche 'window.console', poiché non hanno nemmeno implementazioni. – Norguard

+1

*** "Devo notare che sto pensando a questo su node.js." *** –

risposta

1

Firebug fa registrare le proprietà ereditate:

enter image description here

mentre Chrome ti dà una vista ad albero che comprende le proprietà ereditate:

enter image description here

+0

@dwerner Chrome fornisce una vista ad albero. 'console.log' è specifico per l'implementazione. Sembra che Node.js abbia deciso di registrare solo le proprie proprietà.Naturalmente, ciò non significa che l'oggetto non erediti le altre due proprietà. –

4

che è possibile utilizzare console.dir() ove disponibile

console.dir(derived) 

e si metterà a mostrare le proprietà ereditate del vostro oggetto sull'oggetto __proto__

Edit: doesnt sembrano presentarsi sul nodo se

+0

È anche utile sapere su console.dir(), grazie. Non sono sicuro di voler fare affidamento su '__proto__'. – dwerner

Problemi correlati