2016-04-13 6 views
2

Ist es möglich, alle mit Object.defineProperty definierten Eigenschaften aufzulisten? Diese nicht angezeigt, während durch das Objekt iterieren:So listen Sie Eigenschaften auf, die mit Object.defineProperty definiert sind

for (var prop in obj) { ... } 

Und weder mit Object.getOwnPropertyNames.

Update: Ich denke, es ist nur möglich, wenn sie mit dem Aufzählungszeichen: True Flag erstellt werden.

+1

Nicht enumerable Eigenschaften ** ** sind enthalten in dem Array von '.getOwnPropertyNames() zurückgegeben'. – Pointy

+0

Können Sie mehr Code teilen? Insbesondere funktioniert WRT 'Object.getOwnPropertyNames' nicht? –

Antwort

4

Nicht enumerable Eigenschaften zurückgegeben von Object.getOwnPropertyNames:

var obj = {}; 
 
Object.defineProperty(obj, "foo", {value:42}); 
 
document.body.innerHTML = Object.getOwnPropertyNames(obj).join(", ");

Wenn Sie sie mit Symbol definieren, anstatt String-Namen, dann würden Sie Object.getOwnPropertySymbols verwenden.

Wenn Sie nicht aufzählbare vererbte Eigenschaften finden müssen, müssen Sie Ihre Prototyp-Kette über Object.getPrototypeOf schleifen.

Hier ist ein Beispiel für das Finden aller Eigenschaftsnamen, die Zeichenfolgen sind, unabhängig davon, ob sie aufzählbar sind, einschließlich geerbte (beachten Sie, dass wir die Nicht-Enumerables unter Object.prototype sehen; wir könnten früher aufhören, wenn wir sie nicht möchten):

var proto = {} 
 
Object.defineProperty(proto, "answer", {value: 42}); 
 
var obj = Object.create(proto); 
 
Object.defineProperty(obj, "question", {value: "Life, the Universe, and Everything"}); 
 

 
document.body.innerHTML = getAllPropertyNames(obj).join(", "); 
 

 
function getAllPropertyNames(o) { 
 
    var names = []; 
 
    while (o) {  // We'd use `o != Object.prototype` to stop earlier 
 
    names.push.apply(names, Object.getOwnPropertyNames(o)); 
 
    o = Object.getPrototypeOf(o); 
 
    } 
 
    return names; 
 
}

+3

Ich schwöre absolut, dass ich Ihren Eröffnungssatz nicht kopiert habe. – Pointy

+0

@ Pointy: LOL !! Ich liebe es. Betonung und alles. –

Verwandte Themen