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

新手上路,请多包涵

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

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

该解决方案对我有用,可以以“漂亮”的方式重用代码。

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

可能是什么原因造成的?我是否缺少有关修改标准对象原型的内容?

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

原文由 mati 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 393
2 个回答

虽然与其他代码冲突的可能性仍然存在风险,但如果您想使用现代版本的 JavaScript 执行此操作,则可以使用 Object.defineProperty 方法,例如

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

原文由 csells 发布,翻译遵循 CC BY-SA 4.0 许可协议

修改内置对象原型通常不是一个好主意,因为它总是有可能与加载在同一页面上的其他供应商或库的代码发生冲突。

在 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'
}

不幸的是,执行此操作的可疑代码的存在使得有必要避免使用普通 for..in 进行数组迭代,至少如果你想要最大的可移植性,只是为了防止一些其他讨厌的代码被修改的情况数组原型。所以你真的需要做这两件事:你应该避免 plain for..in 以防某些 n00b 修改了 Array 原型,你应该避免修改 Array 原型,这样你就不会弄乱任何使用 plain 的代码 for..in 遍历数组。

最好创建自己类型的对象构造函数,其中包含 doSomething 函数,而不是扩展内置数组。

Object.defineProperty 怎么样?

现在存在 Object.defineProperty 作为扩展对象原型的一般方法,而无需枚举新属性,尽管这仍然不能证明扩展 内置 类型是合理的,因为即使除了 for..in 还有仍然有可能与其他脚本发生冲突。考虑使用两个 Javascript 框架的人,它们都尝试以类似的方式扩展 Array 并选择相同的方法名称。或者,考虑有人分叉 您的 代码,然后将原始版本和分叉版本放在同一页面上。 Array 对象的自定义增强功能是否仍然有效?

这是 Javascript 的现实,也是为什么你应该避免修改内置类型的原型,即使是 Object.defineProperty 。使用您自己的构造函数定义您自己的类型。

原文由 thomasrutter 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题