Reflect.ownKeys与Object.keys与for in

584 阅读1分钟
class D {
  constructor() {
    super();
    this.x = 10;
  }
  getX() {
    console.log('x');
  }
}
D.prototype.getY = function() {
  console.log('y');
}

const d = new D();

for (let key in d) {
  console.log(key);  //=>x getY   ——————1
}
console.log(Reflect.ownKeys(d));  //=>['x']  ——————2
console.log(Reflect.ownKeys(d.__proto__));  //=>['constructor', 'getX', 'getY']  ——————3

console.log(Object.keys(d));   //=>['x']   ——————4
console.log(Object.keys(d.__proto__)); //=>['getY']   ——————5

结论:
for...in...: 遍历实例原型链上的所有可枚举属性,由第一个输出结果可知,在类中添加到原型上的属性不可枚举,在类外添加到原型上的属性可枚举;

Reflect.ownKeys: 由第2、3个输出结果可知,遍历当前对象所有私有属性(包含可枚举和不可枚举属性);

Object.keys: 由第4、5个输出结果可知,遍历当前对象所有可枚举私有属性。