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

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

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

这个解决方案对我来说很有效,可以用'漂亮'的方式重用代码。

但是,当我测试了它与整个页面一起工作时,我遇到了问题。我们有一些自定义的ajax扩展器,它们开始表现为意外:一些控件围绕其内容或值显示“未定义”。

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

注意:我非常肯定,当我修改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函数创建自己的对象构造函数类型,而不是扩展内置的数组。


编辑:重复我在评论中的内容:

反之亦然 - 如果某些n00b已经修改了Array原型,则应该避免使用..in,并且应该避免修改Array原型,以防n00b在数组中使用for..in。 ;)

此外,现在存在Object.defineProperty作为扩展对象原型的一般方式,而不需要新的属性可枚举,尽管我仍然不会将此用作扩展内置类型的理由,因为除了for..in之外,还有仍然可能与其他脚本发生其他冲突。 考虑有人派生你的代码,然后把两个版本放在同一个页面上 - 你对Array对象的自定义增强功能是否仍然可以像你期望的那样工作?


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

// 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]
}

以上是可以的,因为在解释时间内功能被抬升到顶部。

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

myArray.foo() // <- 'undefined function foo'

Array.prototype.foo = function(){
    return this[0]
}

为了这个工作,只需在顶部定义原型:

Array.prototype.foo = function(){
    return this[0]
}

myArray.foo() // <- 'apple'

是的! 你可以重写原型! 它被允许。 您甚至可以为阵列定义自己的add方法。

链接地址: http://www.djcxy.com/p/417.html

上一篇: adding custom functions into Array.prototype

下一篇: Why doesn't indexOf work on an array IE8?