2016-10-18 11 views
2

私はes6クラスのインスタンスを持っているので、すべてのプロパティ(および継承プロパティも)を取得する必要があります。プロトタイプチェーンを通過することなくこれを行う方法はありますか?オブジェクトのプロトタイプチェーンのすべてのプロパティを反復処理する方法は?

class A { 
 
    get a() { 
 
    return 123; 
 
    } 
 
} 
 

 
class B extends A { 
 
    get b() { 
 
    return 456; 
 
    } 
 
} 
 

 
const b = new B(); 
 

 
for (let prop in b) { 
 
    console.log(prop); //nothing 
 
} 
 

 
console.log(Object.keys(b)); //empty array 
 
console.log(Object.getOwnPropertyNames(b)); //empty array 
 
console.log(Reflect.ownKeys(b)); //empty array 
 
console.log(Object.keys(Object.getPrototypeOf(b))); //empty array 
 
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a" 
 
console.log(Reflect.ownKeys(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a"

答えて

5

...(とあまりにもプロパティを継承)。プロトタイプチェーンを通過することなくこれを行う方法はありますか?

bプロパティは、列挙できない場合は該当しません。列挙できないプロパティ(!)を列挙するには、getOwnPropertyNames(およびgetOwnPropertySymbols)を使用し、継承されたプロパティを含めるには、プロトタイプチェーンをループする必要があります。私はあなたがtoStringhasOwnProperty、および、そのようなようObject.prototype上のものをスキップしたいと仮定

class A { 
 
    get a() { 
 
    return 123; 
 
    } 
 
} 
 

 
class B extends A { 
 
    get b() { 
 
    return 456; 
 
    } 
 
} 
 

 
const b = new B(); 
 

 
let allNames = new Set(); 
 
for (let o = b; o != Object.prototype; o = Object.getPrototypeOf(o)) { 
 
    for (let name of Object.getOwnPropertyNames(o)) { 
 
    allNames.add(name); 
 
    } 
 
} 
 
console.log(Array.from(allNames));

注:問題ではありません

。それらを含める場合は、ループ条件をo != nullに変更してください(またはそのようなものが好きな場合はoのみ)。

関連する問題