2015-05-11 13 views
11

C'è un altro modo per cercare le proprietà del prototipo di un oggetto javascript. Diciamo che mi piace questo.Elenco di tutte le proprietà del prototipo di un oggetto Javascript

function proton() { 
    this.property1 = undefined; 
    this.property2 = undefined; 
}; 

proton.prototype = { 

    sample1 : function() { 
     return 'something'; 
    }, 

    sample2 : function() { 
     return 'something'; 
    } 

}; 

var my_object = new proton(); 

console.log(Object.keys(my_object)); 

ritorna [ "proprietà1", "Property2"]

console.log(Object.getOwnPropertyNames(my_object)); 

ritorna [ "proprietà1", "Property2"]

ma quello che voglio stampare è la proprietà prototipo del oggetto my_object.

[ 'sample1', 'sample2']

Al fine per me vedere le proprietà prototipo di tale oggetto ho bisogno di console.log (oggetto) e da strumenti di sviluppo che posso guardare in alto per le proprietà di quell'oggetto.

Ma dal momento che sto usando librerie di terze parti come phaser.js, react.js, create.js quindi non conosco l'elenco delle proprietà di prototipo di un oggetto creato da queste librerie.

Esiste una funzione di prototipo di Oggetto per elencare tutte le proprietà di prototpye di un oggetto javascript?

risposta

22

Non è un metodo prototipo, ma è possibile utilizzare Object.getPrototypeOf per attraversare la catena di prototipi e quindi ottenere i nomi di proprietà di ciascuno di questi oggetti.

function logAllProperties(obj) { 
    if (obj == null) return; // recursive approach 
    console.log(Object.getOwnPropertyNames(obj)); 
    logAllProperties(Object.getPrototypeOf(obj)); 
} 
logAllProperties(my_object); 

Usando questo, si può anche scrivere una funzione che si restituisce un array di tutti i nomi di proprietà:

function props(obj) { 
    var p = []; 
    for (; obj != null; obj = Object.getPrototypeOf(obj)) { 
     var op = Object.getOwnPropertyNames(obj); 
     for (var i=0; i<op.length; i++) 
      if (p.indexOf(op[i]) == -1) 
       p.push(op[i]); 
    } 
    return p; 
} 
console.log(props(my_object)); // ["property1", "property2", "sample1", "sample2", "constructor", "toString", "toLocaleString", "valueOf", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable" 
+1

Qui non c'è un guru JS, c'è qualche ragione per cui l'accesso a '__proto__' e la sua conversione in un array è una cattiva idea? ex: 'var arr = Object.keys (my_object .__ proto __). map (function (key) {return my_object .__ proto __ [key]}); ' – Bassem

+1

@BassemDy Per uno,' .__ proto__' è come 'Object.getPrototypeOf' ma deprecato e non funziona in alcuni casi limite. Inoltre, l'accesso a un solo livello della catena del prototipo potrebbe non ottenere tutte le proprietà. Btw, OP sembra essere interessato ai nomi delle proprietà non ai valori, quindi puoi omettere quel '.map (...)' – Bergi

6
function prototypeProperties(obj) { 
    var result = []; 
    for (var prop in obj) { 
    if (!obj.hasOwnProperty(prop)) { 
     result.push(prop); 
    } 
    } 
    return result; 
} 

MODIFICA: Questo prenderà tutte le proprietà che sono state definite su qualsiasi antenato. Se vuoi un controllo più granulare di ciò che è definito dove, il suggerimento di Bergi è buono.

+1

Si noti che questo stamperà solo * proprietà enumerabili *, mentre la risposta accettata stamperà * tutte * le proprietà, enumerabili o meno. –

Problemi correlati