2016-04-13 16 views
2

Object.definePropertyを使用して定義されたすべてのプロパティをリストすることは可能ですか?リストの表示方法Object.definePropertyで定義されたプロパティ

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

どちらもObject.getOwnPropertyNamesと:オブジェクトを繰り返し処理しながら、 これらは表示されません。

更新:これは、enumerable:trueフラグを設定して作成した場合のみ可能です。

+1

非列挙特性** '.getOwnPropertyNames() 'から返された配列に含まれています。 – Pointy

+0

もっとコードを共有できますか?特にWRT 'Object.getOwnPropertyNames'は動作しませんか? –

答えて

4

非可算のプロパティObject.getOwnPropertyNamesによって返さです:

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

あなたはSymbolではなく文字列名でそれらを定義した場合、あなたはObject.getOwnPropertySymbolsを使用すると思います。

継承されたのプロパティを見つける必要がある場合は、プロトタイプチェーンをObject.getPrototypeOfでループする必要があります。

継承されたものを含めて、列挙可能かどうかにかかわらず、文字列であるすべてのプロパティ名を検索する例を示します(Object.prototypeの非列挙型を参照してください。 ):

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

私はあなたのオープニングセンテンスをコピーしていないことを絶対に誓っています。 – Pointy

+0

@Pointy:LOL !!大好きです。強調とすべて。 –

関連する問題