【问题标题】:How to iterate over all properties in object's prototype chain?如何遍历对象原型链中的所有属性?
【发布时间】:2016-10-18 07:31:19
【问题描述】:

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

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"

【问题讨论】:

    标签: javascript ecmascript-6


    【解决方案1】:

    ...(以及继承的属性)。有没有办法在不遍历原型链的情况下做到这一点?

    如果它们不可枚举,则不是,因为您的 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));

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多