gpt4 book ai didi

javascript - 如何遍历对象原型(prototype)链中的所有属性?

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

我有一个 es6 类实例,我需要获取它的所有属性(以及继承的属性)。有没有办法不用遍历原型(prototype)链就可以做到这一点?

class A {
get a() {
return 123;
}
}

class B extends A {
get b() {
return 456;
}
}

const b = new B();

for (let prop in b) {
console.log(prop); //nothing
}

console.log(Object.keys(b)); //empty array
console.log(Object.getOwnPropertyNames(b)); //empty array
console.log(Reflect.ownKeys(b)); //empty array
console.log(Object.keys(Object.getPrototypeOf(b))); //empty array
console.log(Object.getOwnPropertyNames(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a"
console.log(Reflect.ownKeys(Object.getPrototypeOf(b))); //["contructor", "b"] -- without "a"

最佳答案

...(and inherited properties too). Is there a way to do this without traversing prototype chain?

如果它们是不可枚举的,则不是,因为您的 b 属性是。要枚举不可枚举的属性 (!),您必须使用 getOwnPropertyNames(和 getOwnPropertySymbols),并且要包含继承的属性,您必须遍历原型(prototype)链。

这不是问题:

class A {
get a() {
return 123;
}
}

class B extends A {
get b() {
return 456;
}
}

const b = new B();

let allNames = new Set();
for (let o = b; o && o != Object.prototype; o = Object.getPrototypeOf(o)) {
for (let name of Object.getOwnPropertyNames(o)) {
allNames.add(name);
}
}
console.log(Array.from(allNames));

请注意,我假设您想跳过 Object.prototype 上的那些,例如 toStringhasOwnProperty 等。如果您想包括这些,请将循环条件更改为 o != null(如果您喜欢这种情况,则只需更改 o)。

关于javascript - 如何遍历对象原型(prototype)链中的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40102148/

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