gpt4 book ai didi

javascript - 将 ES6 类 getter 设置为可枚举

转载 作者:行者123 更新时间:2023-12-03 01:25:11 25 4
gpt4 key购买 nike

我有一个带有 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 Example

最佳答案

ES6 风格的 getter 是在原型(prototype)上定义的,而不是在每个单独的 person 上定义的。要将 greeting 属性设置为可枚举,您需要更改:

// Make enumerable (doesn't work)
Object.defineProperty(Person, 'greeting', {enumerable: true});

致:

// Make enumerable
Object.defineProperty(Person.prototype, 'greeting', {enumerable: true});

Object.keys仅返回该对象的自己可枚举属性,因此不会返回原型(prototype)上的属性。您可以在 Object.keys( Object.getPrototypeOf( person ) )for...in 中找到 greeting 属性。环形。 Updated Plunker

如果您希望 Person 的每个单独实例都有自己的 greeting,您可以在构造函数中定义它:

class Person {
constructor(myName) {
this.name = myName;

Object.defineProperty( this, 'greeting', {
enumerable: true,
get: function ( ) { return `Hello, I'm ${this.name}`; }
} );
}
}

Updated Plunker

关于javascript - 将 ES6 类 getter 设置为可枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34517538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com