2016-05-20 18 views
0

Ich arbeite gerade an ES6, was mir wirklich Spaß macht.Konnte alle Aktoren einer Klasse nicht aufzählen - Möglicher Fehler?

Das Problem ist, dass ich ein wirklich schlechtes Problem erlebt: Ich kann keinen Weg finden, alle meine Eigenschaften Deskriptoren einer Klasse aufzuzählen.

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 

Antwort

2

Der Punkt ist, dass a keine eigenen Eigenschaften hat. Es tut erben die property Getter aus A.prototype:

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

Wenn Sie alle geerbt und nicht-zählbare Eigenschaften möchten, können Sie auf walk the prototype chain manuell haben werden.

0

Nach einem Tag der Untersuchungen zu verbringen, habe ich am Ende zu dem gleichen Ergebnis auf die

Der Punkt ist, dass ein keine eigenen Eigenschaften hat. Es erbt die Eigenschaft Getter aus A.prototype:

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

Wenn Sie alle geerbt und nicht-zählbare Eigenschaften wollen, müssen Sie die Prototypkette von Hand gehen müssen.

Als Abhilfe habe ich eine statische Eigenschaft meiner AbstractEntity, um den Job zu erledigen

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"] 
(nur mit Klasse Getter/Setter bedenkt)