将自定义函数添加到Array.prototype中

我正在开发一个支持AJAX的asp.net应用程序。 我刚刚添加了一些Array.prototype的方法

Array.prototype.doSomething = function(){ ... } 

这个解决scheme为我工作,可能以“漂亮”的方式重用代码。

但是,当我testing了它与整个页面的工作,我有问题..我们有一些自定义ajax扩展,他们开始performance为意外:一些控件显示“未定义”的内容或价值。

这可能是什么原因? 我错过了修改标准对象原型的东西吗?

注意:我很确定,当我修改Array的原型时,错误就开始了。 它应该只与IE兼容。

一般来说,修改内置的对象原型可能是一个坏主意,因为它总是有可能与同一页上的其他代码发生冲突。

在Array对象原型的情况下,这是一个特别糟糕的想法,因为它有可能干扰任何数组成员迭代的代码片段,例如for .. in

用一个例子来说明(从这里借用):

 Array.prototype.foo = 1; // somewhere deep in other javascript code... var a = [1,2,3,4,5]; for (x in a){ // Now foo is a part of EVERY array and // will show up here as a value of 'x' } 

用doSomething函数创build自己的types的对象构造函数会更好,而不是扩展内置的数组。

尽pipe与其他代码碰撞的可能性代码重写原型上的函数仍然是一个风险,如果你想用现代版本的JavaScript来做到这一点,你可以使用Object.defineProperty方法,closures可枚举位,例如

 // functional sort Object.defineProperty(Array.prototype, 'sortf', { enumerable: false, value: function(compare) { return [].concat(this).sort(compare); } }); 

有一个小心! 也许你是这样做的: 小提琴演示

让我们说一个数组和返回第一个元素的方法foo:

 var myArray = ["apple","ball","cat"]; foo(myArray) // <- 'apple' function foo(array){ return array[0] } 

以上是可以的,因为在解释时间内function被提升到最高。

但是,这不起作用:(因为原型没有定义)

 myArray.foo() // <- 'undefined function foo' Array.prototype.foo = function(){ return this[0] } 

为此,只需在顶部定义原型:

 Array.prototype.foo = function(){ return this[0] } myArray.foo() // <- 'apple' 

是的! 你可以重写原型! 这是允许的。 你甚至可以定义自己的数组add方法。

一般搞乱核心的JavaScript对象是一个坏主意。 你永远不知道任何第三方库可能会期待和更改JavaScript中的核心对象改变他们的一切。

如果你使用Prototype,那么它特别糟糕,因为原型和全球范围一样混乱,很难判断你是否要碰撞。 实际上修改任何语言的核心部分通常是一个坏主意,即使在JavaScript。

(lisp可能是那里的小例外)

你可以说增加了generics。 你可能已经覆盖了一些其他库的function,这就是为什么它停止工作。

假设你正在使用的一些库扩展Array与函数Array.remove()。 在lib已经加载之后,您还可以将remove()添加到Array的原型,但是具有您自己的function。 当lib将调用你的函数,它可能会按照预期的不同的方式工作,并打破它的执行…这就是发生在这里。