Object.keys()中没有带'get'访问器的JavaScript对象属性

xriantvc  于 2023-01-01  发布在  Java
关注(0)|答案(2)|浏览(162)

假设我有一个类,它有一个公共属性,只有一个get访问器,我希望能够通过对象键循环来处理对象。

class Foo {
    get bar() {
        return 'barval';
    }
}

为什么当我调用Object.keys(...)(或类似的函数)或循环通过对象中的键时bar不可见?foo.bar在请求时成功返回barval,但当我期望Object.keys(foo)返回["bar"]时,它返回了一个空数组。这是为什么?

示例输出:

const foo = new Foo();
console.log(foo.bar,            // barval
    Object.keys(foo),           // []
    Object.entries(foo),        // []
    Object.values(foo));        // []
for (let key in foo)
    console.log(key, foo[key]); // Never reached
44u64gxh

44u64gxh1#

类getter和setter不是类示例的属性,因此它们在keysentriesvalues中不可用。
它们是对象原型的成员,你可以遍历原型,去掉constructor之类的,只留下你在类中声明的那些。
据我所知,唯一的办法就是:

class Foo {
    get bar() {
        return 'barval';
    }
}

const foo = new Foo();

for (const prop of Object.getOwnPropertyNames(Object.getPrototypeOf(foo))) {
    console.log(prop);
}

退货:

constructor
bar
avwztpqn

avwztpqn2#

您可以改用Object.getOwnPropertyDescriptors

class Foo {
    get bar() {
        return 'barval';
    }
}
let o = Object.getOwnPropertyDescriptors(Foo.prototype);
console.log(o);
.as-console-wrapper{max-height:100%!important;top:0}

相关问题