ES6 style getters are defined on the prototype, not on each individual person
. To set the greeting
property to enumerable you need to change:
// Make enumerable (doesn't work)
Object.defineProperty(Person, 'greeting', {enumerable: true});
To:
// Make enumerable
Object.defineProperty(Person.prototype, 'greeting', {enumerable: true});
Object.keys only returns that object's own enumerable properties, so properties on the prototype are not returned. You will find the greeting
property in Object.keys( Object.getPrototypeOf( person ) )
, or in a for...in loop. Updated Plunker
If instead, you want each individual instance of Person to have its own greeting
you can define it in the constructor:
class Person {
constructor(myName) {
this.name = myName;
Object.defineProperty( this, 'greeting', {
enumerable: true,
get: function ( ) { return `Hello, I'm ${this.name}`; }
} );
}
}
Updated Plunker
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…