2

我有许多需要使用的功能方法,并且我需要使用此方法发布一个库以与 JavaScript 开发人员共享它非常有帮助,因此例如我需要添加一个名为的方法duplicates 将返回给我的 Array 的副本为你可以看到这个方法不是由 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 类来添加功能,如果它不是官方发布的 ECMA 而是我们从 Array 类继承然后玩它???

或者它可以做原型吗?

后果是什么

问候

4

2 回答 2

6

对于您自己的代码,可以添加一个duplicates方法,Array.prototype但您确实需要为如果您使用错误地用于for..in循环遍历数组的代码(您自己的或您正在使用的东西)可能发生的情况做好准备,如下所示:

for (var i in myArray) { // <==== Wrong without safeguards
}

...因为i"duplicates"在某个时候获得值,因为for..in循环遍历对象及其原型的可枚举属性,它不会循环遍历数组索引。for..in如果处理得当,可以在数组上使用它,在 SO 的其他答案中更多。

如果你只打算在支持 ES5 的环境中工作(现代浏览器,而不是 IE8 和更早版本),你可以通过添加你的duplicatesvia来避免这种情况Object.defineProperty,如下所示:

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

于 2013-01-26T15:09:06.780 回答
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

自己看

于 2013-01-26T15:10:49.433 回答