Javascript 使用新方法原型化数组类的最佳方法是什么

Javascript 使用新方法原型化数组类的最佳方法是什么,javascript,javascript-framework,Javascript,Javascript Framework,我有很多函数方法需要使用它,我需要发布一个带有这些方法的库,以便与JavaScript开发人员共享它。这非常有帮助,因此,例如,我需要添加一个名为duplicates的方法,将返回数组的副本 正如你所看到的,ECMA并没有正式发布这个方法,所以我不知道最好的脚本格式 1- 像这样使用它 [1,2,2].duplicates(); Ary([1,2,2]).duplicates(); 二,- 我需要知道的是,如果不是用ECMA正式发布的,而是从Array类继承并使用它,那么直接使用protot

我有很多函数方法需要使用它,我需要发布一个带有这些方法的库,以便与JavaScript开发人员共享它。这非常有帮助,因此,例如,我需要添加一个名为
duplicates的方法,
将返回数组的副本 正如你所看到的,ECMA并没有正式发布这个方法,所以我不知道最好的脚本格式

1-

像这样使用它

[1,2,2].duplicates();
Ary([1,2,2]).duplicates();
二,-

我需要知道的是,如果不是用ECMA正式发布的,而是从Array类继承并使用它,那么直接使用prototype到Array JavaScript类来添加功能更像是这样吗

或者它可以吗

后果如何


对于您自己的代码,可以向
数组中添加
duplicates
方法。prototype
但是如果您使用的代码(您自己的或您正在使用的东西)错误地使用了
。在
中循环通过如下数组,您确实需要做好准备:

for (var i in myArray) { // <==== Wrong without safeguards
}
Object.defineProperty(Array.prototype, "duplicates", {
    value: function() {
        // ...the code for 'duplicates' here
    }
});
以这种方式定义的属性不可枚举,因此不会显示在
循环中的
for..中,因此无法正确处理数组中for..的代码不会受到影响


不幸的是,在JavaScript中,目前不可能正确地从
Array.prototype
(您的第二个选项)派生,因为
Array
对名称都是数字的属性(称为“数组索引”)进行特殊处理,并有一个特殊的
length
属性。当前在派生对象中都无法正确提供这两个选项。有关这些特殊属性的更多信息,请参阅我的博客文章。

作为一般规则:不要对本机Javascript对象原型进行修补。它可能看起来无害,但如果您在站点/应用程序中包含第三方代码,它可能会导致各种微妙的错误

修改
数组
原型尤其有害,因为互联网上到处都是错误的代码,这些错误的代码使用
对数组进行迭代。。。在
构造中

请查看:

for(var i in [1,2,3]) {
    console.log(i);
}
产出:

1
2
3
但是如果您已经修改了
数组
原型,如下所示:

Array.prototype.duplicates = function() { }
它输出

1
2
3
duplicates

.

Related:and@Matt:
Array
不是DOM的一部分。
Array.prototype.duplicates = function() { }
1
2
3
duplicates