使用新方法对Array Class进行原型设计的最佳方法是什么?

时间:2013-01-26 15:00:58

标签: javascript javascript-framework

我有许多功能方法需要使用它,我需要使用这些方法发布一个库,以便与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然后玩它?

或者它可以做原型吗?

以及后果是什么

问候

2 个答案:

答案 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

See for yourself