2012-02-09 16 views
6

Quindi ho l'oggetto vuoto a = {}. Quando faccio console.log(a), console.dir(a), o ancheStampa di tutte le proprietà nascoste di un oggetto

for(b in a) { 
    console.log(b); 
} 

non ho ricevuto per vedere le "proprietà nascoste" come ad esempio __defineGetter__, hasOwnProperty, ecc

Come posso stampare tutti proprietà di un oggetto ?

+0

Quale browser hai usato? In Google Chrome vedo tutte le proprietà dell'oggetto – antyrat

+0

@antyrat Sto utilizzando Google Chrome 17 e l'unica proprietà che vedo usando 'console.log' è' __proto__'. – Randomblue

+0

Puoi aprire questa proprietà e al suo interno vedrai tutte le proprietà non enumerabili – antyrat

risposta

12

Quello che cercate è le proprietà non-enumerable di un oggetto (e possibilmente quelle che eredita dal suo prototipo). Non credo che ci sia un modo standard per ottenerli tramite JavaScript.

Se si utilizza un debugger e si ispeziona un oggetto, in genere vengono mostrate tutte le proprietà di un oggetto (non solo quelle enumerabili). Tutti i principali browser hanno ora i debugger integrati: Chrome ha Dev Tools (Ctrl + Shift + I); IE8 e versioni successive hanno "Strumenti di sviluppo F12"; IE7 e precedenti possono essere sottoposti a debugging tramite la versione gratuita di VS.Net; le versioni recenti di Firefox hanno strumenti integrati, per le versioni precedenti è possibile ottenere il plug-in Firebug; Opera ha Dragonfly.

Aggiornamento: Nei commenti sulla questione che hai detto:

sto usando Google Chrome 17 e l'unica proprietà che vedo con console.log è __proto__.

Diritto. {} non ha alcuna proprietà, solo un prototipo. Se fai clic sulla piccola freccia a sinistra di __proto__, verranno visualizzate le proprietà di __proto__. hasOwnProperty, toString, ecc., Tutte le proprietà {} derivano dal prototipo (che è Object.prototype), non dalle proprietà dell'oggetto stesso.

JavaScript utilizza l'ereditarietà prototipo, che significa che un oggetto è supportato da un prototipo. Se si tenta di recuperare il valore di una proprietà che l'oggetto non ha, il motore JavaScript guarderà il prototipo dell'oggetto per vedere se il prototipo ha quella proprietà; se è così, quel valore è usato. Se il prototipo non ce l'ha, il motore guarda il prototipo del prototipo; e così via fino a raggiungere la radice della gerarchia. Questo è il motivo per cui si sente parlare di oggetti con le loro proprietà e proprietà ereditate.

Ecco un esempio:

Ecco una funzione di costruzione. Mettiamo una proprietà sul prototipo che il motore JavaScript assegnerà se usiamo new Foo per creare un oggetto.

function Foo() { 
} 
Foo.prototype.bar = 42; 

Creiamo un oggetto utilizzando quel costruttore:

var f = new Foo(); 

f non ha proprietà a tutti, e tuttavia:

console.log(f.bar); // 42 

...poiché poiché f non ha una proprietà denominata "bar", il motore utilizza il prototipo f, che è l'oggetto Foo.prototype.

Ora diamo f un proprio "bar" di proprietà:

f.bar = 67; 
console.log(f.bar); // 67 

Ora diamo rimuoveref s' "bar" di proprietà:

delete f.bar; 

Cosa accadrà se cerchiamo di recuperare f.bar adesso?

console.log(f.bar); 

Se lei ha detto 42, si ottiene il massimo dei voti. Poiché f non ha più una proprietà chiamata "bar", torniamo indietro per ottenerla dal prototipo.

Si noti che questo rapporto è vivo, quindi:

Foo.prototype.bar = 96; 
console.log(f.bar); // 96 

Nel 3 ° edizione di ECMAScript (la maggior parte dei browser implementano qualcosa sulla falsariga del 3 ° edizione), l'unico modo per assegnare un prototipo un oggetto è tramite la proprietà prototype della funzione di costruzione, come sopra. Con la 5 ° edizione, è stato aggiunto un modo più diretto: Object.create, che è possibile passare un oggetto prototipo direttamente:

var proto = {bar: 42}; 
var obj = Object.create(proto); 
console.log(obj.bar); // 42 
proto.bar = 67; 
console.log(obj.bar); // 67 
+0

Molto ben scritto (+1), grazie :) – nkm

3

Object.getOwnPropertyNames (obj) sarà anche mostrare ogni proprietà non numerabile, anche se non seguirà la ricerca prototype chain come fa ..

Non conosco alcun metodo che sia risalga la catena del prototipo e mostri non enumerabili.

Esempio:

var o = Object.create({base:0}) 
Object.defineProperty(o, 'yes', {enumerable: true}) 
Object.defineProperty(o, 'not', {enumerable: false}) 

console.log(Object.getOwnPropertyNames(o)) 
// [ 'yes', 'not' ] 

console.log(Object.keys(o)) 
// [ 'not' ] 

for (var x in o) 
    console.log(x) 
// yes, base 

Quindi concludiamo:

  • Object.keys() non va a monte della catena, e non mostra non enumerables
  • for in va a monte della catena, ma non mostra non-enumerables

Si potrebbe naturalmente scalare manualmente la catena del prototipo e utilizzare Object.getOwnPropertyNames.

Per il caso di Object, __defineGetter__ e hasOwnProperty sono proprietà di Object.prototype trovato su new Object oggetti attraverso ricerca prototipo catena. Così si potrebbe farli con:

console.log(Object.getOwnPropertyNames(Object.prototype)) 

uscita:

[ 'constructor', 
    'toString', 
    'toLocaleString', 
    'valueOf', 
    'hasOwnProperty', 
    'isPrototypeOf', 
    'propertyIsEnumerable', 
    '__defineGetter__', 
    '__lookupGetter__', 
    '__defineSetter__', 
    '__lookupSetter__' ] 
Problemi correlati