我有一个带有getter属性的ES6类(用babeljs反编译).我知道默认情况下这些属性不可枚举.但是,我不明白为什么我无法使用可枚举的属性Object.defineProperty
// Declare class class Person { constructor(myName) { this.name = myName; } get greeting() { return `Hello, I'm ${this.name}`; } } // Make enumerable (doesn't work) Object.defineProperty(Person, 'greeting', {enumerable: true}); // Create an instance and get enumerable properties var person = new Person('Billy'); var enumerableProperties = Object.keys(person); // => ['name']
Plunker示例
ES6风格的getter是在原型上定义的,而不是在每个人身上person
.要将greeting
属性设置为可枚举,您需要更改:
// Make enumerable (doesn't work) Object.defineProperty(Person, 'greeting', {enumerable: true});
至:
// Make enumerable Object.defineProperty(Person.prototype, 'greeting', {enumerable: true});
Object.keys只返回该对象拥有的可枚举属性,因此不返回原型上的属性.你会发现greeting
在财产Object.keys( Object.getPrototypeOf( person ) )
,或在对...的循环.更新了Plunker
相反,如果您希望Person的每个实例都有自己的实例,greeting
您可以在构造函数中定义它:
class Person { constructor(myName) { this.name = myName; Object.defineProperty( this, 'greeting', { enumerable: true, get: function ( ) { return `Hello, I'm ${this.name}`; } } ); } }
更新了Plunker