当前位置:嗨网首页>书籍在线阅读

13-枚举对象属性,回顾

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

9.2.8 枚举对象属性,回顾

前面已经学习了如何使用 for...in 来枚举对象的属性,也学习了原型继承,完全理解 hasOwnProperty 在枚举对象属性时的用途。对于对象 obj 和属性x,如果 obj 中存在x属性, obj.hasOwnProperty(x) 返回 true 。反之,如果属性没有定义或者定义在原型链中, obj.hasOwnProperty(x) 结果为 false

如果按照正确的用法使用 ES6 中的类,数据属性始终被定义在实例中,而不在原型链中。然而,因为没有办法防止在原型上直接添加属性,所以最好使用 hasOwnProperty 做校验。看看这个例子:

class Super {
   constructor() {
      this.name = 'Super';
      this.isSuper = true;
   }
} 
// 合法,但不推荐这么做
Super.prototype.sneaky = 'not recommended!';
class Sub extends Super {
   constructor() {
      super();
      this.name = 'Sub';
      this.isSub = true;
   } 
} 
const obj = new Sub();
for(let p in obj) {
   console.log('${p}: ${obj[p]}' +
      (obj.hasOwnProperty(p) ? '' : ' (inherited)'));
}

如果运行这个程序,会看到:

name: Sub
isSuper: true
isSub: true
sneaky: not recommended! (inherited)

nameisSuperisSub 三个属性都被定义在实例中,而不是在原型链中(注意在父类构造器中定义的属性也会被定义在子类的实例中)。另一方面,属性 sneaky 被手动添加到父类的原型中。

使用 Object.keys 就可以完全避免这个问题,因为 Object.keys 只包含了原型中定义的属性。