将自定义函数添加到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将调用你的函数,它可能会按照预期的不同的方式工作,并打破它的执行…这就是发生在这里。