2015-05-11 14 views
11

Czy istnieje inny sposób sprawdzenia właściwości prototyp obiektu javascript. Powiedzmy, że to lubię.Lista wszystkich właściwości prototyp obiektu 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)); 

powraca [ "property1", "Property2"]

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

powraca [ "property1", "Property2"]

Ale co chcę wydrukować to właściwości prototyp obiekt my_object.

[ „sample1”, „sample2”]

W porządku dla mnie, aby zobaczyć właściwości prototyp tego obiektu muszę console.log (object) oraz narzędzi programistycznych mogę patrzeć na właściwości ten obiekt.

Ale ponieważ korzystam z bibliotek stron trzecich, takich jak phaser.js, react.js, create.js , więc nie znam listy właściwości prototypu utworzonego obiektu z tych bibliotek.

Czy istnieje prototyp funkcji obiektu do listy wszystkich właściwości prototpye obiektu javascript?

Odpowiedz

22

Nie jest to metoda prototypowa, ale można użyć Object.getPrototypeOf, aby przejść przez łańcuch prototypów, a następnie uzyskać własne nazwy właściwości każdego z tych obiektów.

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

Korzystanie z tym, można również napisać funkcję, która zwraca Ci tablicę wszystkich nazw własności:

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

Nie jako guru JS, czy jest jakiś powód, dla którego uzyskanie dostępu do '__proto__' i przekonwertowanie go na tablicę jest złym pomysłem? ex: 'var arr = Object.keys (my_object .__ proto __). map (function (key) {return my_object .__ proto __ [key]}); ' – Bassem

+1

@BassemDy Na przykład' .__ proto__' jest podobne do 'Object.getPrototypeOf', ale jest przestarzałe i nie działa w kilku przypadkach. Ponadto dostęp do tylko jednego poziomu prototypowego łańcucha może nie dostarczyć wszystkich właściwości. Btw, OP wydaje się być zainteresowany nazwami właściwości, a nie wartościami, więc możesz pominąć tę .map (...) ' – Bergi

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

EDYTOWANIE: Spowoduje to przechwycenie wszystkich właściwości zdefiniowanych na dowolnym przodku. Jeśli chcesz uzyskać bardziej szczegółową kontrolę nad tym, co jest zdefiniowane, sugestia Bergi jest dobra.

+1

pamiętać, że ten będzie drukowany tylko * przeliczalny * właściwości, podczas gdy zaakceptowane odpowiedź będzie drukować * wszystkie * właściwości, przeliczalne lub nie. –

Powiązane problemy