2016-05-20 7 views
0

最近私は本当に楽しんでいるES6に取り組んでいます。クラスのすべてのacessorsを列挙できません - 可能なバグ?

問題は、私が本当に悪い問題を経験したことです。クラスのすべてのプロパティ記述子を列挙する方法を見つけることができません。

class A { 
    get property(){ 
    return "the 'a' value"; 
    } 
} 

const a = new A(); 

const b = { 
    get property() { 
    return "the 'b' value"; 
    } 
}; 

const objectKeys = (obj) => { 
    return Object.keys(obj).join(', '); 
}; 

const objectPropertyNames = (obj) => { 
    return Object.getOwnPropertyNames(obj).join(', ');; 
}; 

const objectForIn = (obj) => { 
    const result = []; 
    for(const prop in obj){ 
    result.push(prop); 
    } 
    return result.join(', ');; 
} 

console.log(objectKeys(a)); // Output empty string 
console.log(objectKeys(b)); // Output 'property' 

console.log(objectPropertyNames(a)); // Output empty string 
console.log(objectPropertyNames(b)); // Output 'property' 

console.log(objectForIn(a)); // Output empty string 
console.log(objectForIn(b)); // Output 'property' 

console.log(a.hasOwnProperty("property")); // Output false 
console.log(b.hasOwnProperty("property")); // Output true 

console.log(Object.getOwnPropertyDescriptor(a, "property")); // Output undefined 
console.log(Object.getOwnPropertyDescriptor(b, "property")); // Output a valid descriptor 

答えて

2

ポイントはaには、独自のプロパティがありません。あなたはすべての継承と非可算のプロパティをしたい場合は、手動walk the prototype chainする必要があります

console.log(objectPropertyNames(Object.getPrototypeOf(a))); 
console.log(objectPropertyNames(A.prototype)); 

:それはA.prototypeからpropertyゲッターを継承しています。

0

は、調査の一日を過ごした後、私は

ポイントが任意の独自のプロパティを持っていないということです同じ結論に行き着きます。あなたはすべての継承と非可算のプロパティをしたい場合は、手動でプロトタイプチェーンを歩かなければならないでしょう

console.log(objectPropertyNames(Object.getPrototypeOf(a))); console.log(objectPropertyNames(A.prototype));

:それはA.prototypeからプロパティのゲッターを継承しています。良い解決策として

私は(唯一のクラスのゲッター/セッターを使用して考慮して)仕事をするために、私のAbstractEntity

class AbstractEntity { 
    static get keys() { 
     const keys = []; 
     const entries = Object.getOwnPropertyNames(this.prototype); 
     for (const entry of entries) { 
      const descriptor = Object.getOwnPropertyDescriptor(this.prototype, entry); 
      if (descriptor.hasOwnProperty("get")) { 
       keys.push(entry); 
      } 
     } 

     return keys; 
    } 
} 

const _property = new WeakMap(); 
class FakeEntity extends AbstractEntity { 
    get readOnlyProperty() { 
     return true; 
    } 

    get property() { 
     return _property.get(this); 
    } 

    set property(value) { 
     _property.set(this, value); 
    } 

    method() {} 

    static staticMethod() {} 

    static get staticProperty() {} 
} 

console.log(FakeEntity.key); // output ["readOnlyProperty", "property"] 
を静的プロパティを追加しました
関連する問題