我有许多功能方法需要使用它,我需要使用这些方法发布一个库,以便与JavaScript开发人员共享它非常有帮助,例如我需要添加一个名为duplicates
的方法将返回对我来说,数组的重复
正如你所看到的,ECMA没有正式公布这种方法,所以我不知道放置脚本的最佳形式
1-
Array.prototype.duplicate = function (){
//script here its usefull to use `this` refer to the Array
}
像
一样使用它[1,2,2].duplicates();
2 -
var Ary = function(a){
if(!(this instanceOf Ary))
return new Ary(a)
if(Object.prototype.toString.call(a) != '[object Array]')
return new Error(a + 'is not an Array')
else
{
for(var i =0 ; i<a.length; i++)
{
this.push(a[i]);
}
}
}
Ary.prototype = new Array();
Ary.prototype.constructor = Ary;
Ary.prototype.duplicates = function(){
//script here its usefull to use `this` refer to the Array
};
像
一样使用它Ary([1,2,2]).duplicates();
我需要知道是不是更直接使用原型到Array JavaScript Class来添加功能,如果它没有官方发布的ECMA,而是我们继承Array Class然后玩它?
或者它可以做原型吗?
以及后果是什么
问候
答案 0 :(得分:6)
对于您自己的代码,可以向duplicates
添加Array.prototype
方法,但是您需要做好准备,以便在使用代码时可能会发生这种情况(您自己的代码,或者您自己的代码)使用)错误地使用for..in
循环遍历数组:
for (var i in myArray) { // <==== Wrong without safeguards
}
...因为i
会在某个时刻获得值"duplicates"
,因为for..in
遍历对象及其原型的可枚举属性,所以没有循环遍历数组索引。如果处理正确,可以在数组上使用for..in
,在this other answer on SO中更多。
如果您只是在支持ES5的环境(现代浏览器,而不是IE8及更早版本)中工作,您可以通过duplicates
通过Object.defineProperty
添加{...}}来避免这种情况: / p>
Object.defineProperty(Array.prototype, "duplicates", {
value: function() {
// ...the code for 'duplicates' here
}
});
定义该方法的属性不可枚举,因此不会显示在for..in
循环中,因此无法正确处理数组for..in
的代码不会受到影响。
不幸的是,JavaScript目前无法从Array.prototype
(您的第二个选项)正确派生,因为Array
对名称全部为数字的属性(称为“数组索引”)和特殊length
财产。目前,这些都不能在派生对象中正确提供。有关我博客文章A Myth of Arrays中的特殊属性的更多信息。
答案 1 :(得分:2)
作为一般规则:不要修补本机Javascript对象原型。它可能看起来无害,但如果你在你的网站/应用程序中包含第三方代码,它可能会导致各种微妙的错误。
修改Array
原型是特别邪恶的,因为互联网充斥着使用for ... in
构造迭代数组的错误,错误的代码。
检查出来:
for(var i in [1,2,3]) {
console.log(i);
}
输出:
1
2
3
但是如果你修改了Array
原型如下:
Array.prototype.duplicates = function() { }
输出
1
2
3
duplicates