gpt4 book ai didi

javascript - 使用新方法对 Array 类进行原型(prototype)设计的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-01 08:08:13 25 4
gpt4 key购买 nike

我有许多需要使用的功能方法,我需要发布一个包含这些方法的库,以便与 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();

我需要知道,如果它不是由 ECMA 正式发布的,而是直接从 Array 类继承然后使用它,那么直接使用原型(prototype)来添加功能是否更像是 Array JavaScript 类???

或者它可以做原型(prototype)吗??

有什么后果

问候

最佳答案

对于您自己的代码,可以向 Array.prototype 添加一个 duplicates 方法,但是您确实需要为使用代码可能发生的情况做好准备(要么你自己的,或者你正在使用的东西)错误地使用 for..in 来遍历这样的数组:

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

...因为 i 会在某个时候得到值 "duplicates",因为 for..in 循环遍历可枚举属性对于对象及其原型(prototype),它不会遍历数组索引。如果处理得当,可以在数组上使用 for..in,更多信息请参见 this other answer on SO .

如果您只打算在支持 ES5 的环境中工作(现代浏览器,而不是 IE8 和更早版本),您可以通过 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 .

关于javascript - 使用新方法对 Array 类进行原型(prototype)设计的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14538144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com