gpt4 book ai didi

javascript - 如何迭代 ES6/2015 类实例的属性

转载 作者:数据小太阳 更新时间:2023-10-29 06:10:41 25 4
gpt4 key购买 nike

给定这两个类

class Foo{
f1;

get f2(){
return "a";
}
}

class Bar extends Foo {
b1;

get b2(){
return "a";
}
}

let bar = new Bar();

什么代码可以从 bar 实例中获取这个属性列表? ['f1', 'f2', 'b1', 'b2']

Here is a Babel sample


更新

这应该是@Marc C 的回答的一部分:

使用装饰器,我可以轻松地将不可枚举的属性转换为可枚举的属性:

class Bar extends Foo {

@enumerable()
get b2(){
return "a";
}

}

这是装饰器源代码:

function enumerable() {
return function(target, key, descriptor) {
if (descriptor) {
descriptor.enumerable = true;
}
};
}

Here is a Babel sample

最佳答案

那不是 valid syntax for declaring properties在一个类(class)。相反,在构造函数中声明它们。

class Foo {
constructor() {
this.f1 = undefined;
}
}

然后您可以使用 Object.keys 获取它们。

使用 Babel 中的实验性功能将允许您使用该语法声明属性,但必须声明它们的值。

class Foo {
f1 = 0;
...
}

至于访问 getter,默认情况下 getter 是不可枚举的,不能使用 Object.keys 或任何类似机制访问。但是,您可以使用 Object.defineProperty 创建可枚举的 getter .

Object.defineProperty(bar, 'f2', {
get() {
return "a";
}
});

如果您使用的是实验性 ES7 功能,您可以应用 decorator到类方法并获得相同的行为。看这个Babel sample .

class Foo {
@enumerable()
get b2() {
return "a";
}
}

function enumerable() {
return function(target, key, descriptor) {
if (descriptor) {
descriptor.enumerable = true;
}
}
}

关于javascript - 如何迭代 ES6/2015 类实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664400/

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