使用新方法对数组类进行原型设计的最佳方法是什么
What is the best way to prototype Array Class with a new Methods
我有很多函数式方法,我需要使用它,我需要发布一个带有此方法的库以与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
你自己看吧。
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- javascript导入的最佳实践是什么
- 在ng重复循环中显示条件内容的最佳方式是什么
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 在node.js中编写单元测试的最佳方式是什么
- 使用AJAX在Rails中提交动态表单的最佳方式是什么
- 使用Angular存储用户以前是否选中过复选框,然后再调用它的最佳方式是什么
- 列出没有 mysql 的元素的最佳方法是什么
- 在AngularJS中使用多个主题的最佳方式是什么
- 存储数据的最佳方式是什么,以便与jquery一起使用
- 在企业应用程序框架中包含js/css文件的最佳实践是什么
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 用JavaScript随机给网页上的每个字母上色的最佳方式是什么
- 如果我返回表,检查 Ajax 调用是否为 200 OK的最佳方法是什么
- JavaScript - 创建可链接函数时的最佳方法是什么
- 在上下文菜单项单击上显示侧边栏/弹出窗口的最佳方法是什么
- 将JavaScript检测与MVC4显示模式集成的最佳方式是什么
- addEvent()传奇事件之后的当前最佳实践是什么