如何遍历对象的原型链中的所有属性
How to iterate over all properties in object's prototype chain?
我有一个es6-class实例,我需要得到它的所有属性(和继承的属性)。有没有办法在不遍历原型链的情况下做到这一点?
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"
…(以及继承的属性)。有没有办法在不遍历原型链的情况下做到这一点?
如果它们是不可枚举的,就像你的b
属性一样。要枚举不可枚举的属性(!),您必须使用getOwnPropertyNames
(和getOwnPropertySymbols
),并且要包含继承的属性,您必须遍历原型链。
这不是问题:
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));
注意,我假设您想跳过toString
、hasOwnProperty
等Object.prototype
上的内容。如果您想要包含这些,请将循环条件更改为o != null
(或者如果您喜欢这种东西,则更改为o
)。
相关文章:
- 附加到原型属性的Do函数没有闭包
- 日期原型属性
- JS构造函数的原型属性与其原型之间的区别
- 为什么函数对象的实例没有继承函数原型属性
- 为什么浏览器显示原型属性不同
- 为什么在Function.prototype上没有原型属性
- 函数的原型属性
- 原型继承和原型属性
- 在JavaScript中,函数的默认值是多少'的原型属性
- Chrome 不支持 Javascript 中的原型属性吗?
- 我应该在JavaScript中将什么连接到子原型属性
- 更新 JavaScript 中的原型属性
- 请解释有关 JavaScript 中的原型属性和函数构造函数的详细信息
- 为什么原型函数无法读取原型属性
- 与对象属性同名的原型属性
- 如何获取原型属性列表
- 构造函数中的方法与函数的原型属性之间的差异
- JavaScript 原型属性
- 函数对象__proto__和原型属性
- 未在自定义 OL3 控件的构造函数中定义的原型属性