使用新方法对数组类进行原型设计的最佳方法是什么

What is the best way to prototype Array Class with a new Methods

本文关键字:最佳 是什么 方法 原型 新方法 数组      更新时间:2023-09-26

我有很多函数式方法,我需要使用它,我需要发布一个带有此方法的库以与JavaScript开发人员共享它,它非常有帮助,例如我需要添加一个名为duplicates的方法,它将返回给我数组的副本如您所见,此方法尚未由ECMA正式发布,因此我不知道放置脚本的最佳形式

1-

      Array.prototype.duplicate = function (){
        //script here its usefull to use `this` refer to the Array
       }

像使用它一样

[1,2,2].duplicates();

阿拉伯数字-

 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();

我需要知道,如果它不是使用 ECMA 正式发布的,那么直接使用原型到 Array JavaScript 类来添加功能是否更像,相反,我们确实继承了数组类,然后使用它???

或者可以做原型??

后果是什么

问候

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

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

。由于i将在某个时候"duplicates"获取值,因为for..in循环遍历对象及其原型的可枚举属性,因此它不会遍历数组索引。如果您正确处理for..in数组,可以在数组上使用它,更多内容在 SO 的另一个答案中。

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

Object.defineProperty(Array.prototype, "duplicates", {
    value: function() {
        // ...the code for 'duplicates' here
    }
});

以这种方式定义的属性不可枚举,因此不会显示在for..in循环中,因此无法正确处理数组for..in的代码不会受到影响。

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

作为一般规则:不要对原生 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

你自己看吧。