JavaScript应用系列笔记--Array.prototype与for in

240 阅读1分钟

Array.prototype 属性表示 Array 构造函数的原型,并允许您向所有Array对象添加新的属性和方法。

for...in 该for...in语句迭代对象的所有可枚举属性,这些属性以字符串为键(忽略以Symbol为键的那些),包括继承的可枚举属性。

Object.defineProperty Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。该方法允许精确地添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for...in 或 Object.keys 方法),可以改变这些属性的值,也可以删除这些属性。

Object.prototype.hasOwnProperty() 该hasOwnProperty()方法返回一个布尔值,指示对象是否将指定的属性作为自己的属性(而不是继承它)。

以上来源于MDN

问题: 在Array.prototype添加扩展后,使用for in对数组进行迭代,我们期望的是只遍历数组内的值。结果是在Array.prototype原型上添加的扩展也会被遍历到。 根据MDN对for in的解释,在Array.prototype上添加的扩展是可枚举属性。 如下图,

image.png image.png

解决方案1: 根据MDN对Object.defineProperty的解释,我们可以使用Object.defineProperty()对原型添加一个不可枚举属性,在使用for in对数组进行迭代的时候,就不会迭代到原型上的扩展。如图:

image.png

image.png

解决方案2: hasOwnProperty(),根绝MDN解释,可以使用hasOwnProperty来过滤掉非自身的属性。也可以实现想要的效果 如图:

image.png

image.png