将方法添加到Array.prototype,没有副作用

时间:2014-03-13 18:30:48

标签: javascript prototype for-in-loop

我想添加"插入"数组上的方法。 所以我这样做:

> Array.prototype.insert = function(index, element){
    this.splice(index, 0, element);
};

它有效:

> a = [1,2,3]
[1, 2, 3]
> a.insert(0, 4)
undefined
> a
[4, 1, 2, 3]

但是有不良副作用:

> for (i in a){console.log(i)}
0
1
2
3
insert

> for (i in a){console.log(a[i])}
4
1
2
3
function (index, element){
    this.splice(index, 0, element);
}

此行为不是故意的,会破坏我使用的其他库。 对此有什么优雅的解决方案吗?

2 个答案:

答案 0 :(得分:8)

Object.defineProperty有效,但旧版浏览器不支持此功能。 (compatibility table

Object.defineProperty(Array.prototype, 'insert', {
  enumerable: false,
  value: function(index, element){
    this.splice(index, 0, element);
  }
});

Demonstration

答案 1 :(得分:0)

在此循环中,不显示继承的属性(插入方法)。

  for (i in a){if (a.hasOwnProperty(i)) {console.log(i)}}

因此,来自Object的每个对象都继承了hasOwnProperty方法。此方法可用于确定对象是否具有指定的属性作为该对象的直接属性;与in运算符不同,此方法不会检查对象的原型链。

此方法与所有浏览器兼容