作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个 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
上的那些,例如 toString
、hasOwnProperty
等。如果您想包括这些,请将循环条件更改为 o != null
(如果您喜欢这种情况,则只需更改 o
)。
关于javascript - 如何遍历对象原型(prototype)链中的所有属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40102148/
我是一名优秀的程序员,十分优秀!