可能重复:
Is it an anti-pattern to modify JavaScript's built-in prototypes?
我刚刚了解到可以修改JavaScript核心对象,但是告诉我如何做的同一篇文章表明我永远不应该这样做。
修改核心JS对象是件坏事吗?如果是这样,这会导致什么问题?
作为一个例子,这里是Array对象的一个修改,它为我提供了一种在数组中搜索给定值的简单方法:
Array.prototype.search = function(val){
var i;
for (i = 0; i < this.length; i++){
if (this[i] == val) {
console.log("found: " + val);
return true;
}
}
console.log("didn't find it");
return false;
};
以下是文章:Advanced Javascript: Objects, Arrays, and Array-Like objects
答案 0 :(得分:4)
是的,在修改所谓的主机对象时,行为是未定义的。它可能会起作用(通常它适用于像Array,String和Object这样的对象),它可能会破坏它。
但是,您应该从不修改prototype
或Array
的{{1}},因为它会为数组和对象中断Object
,除非您包含for(var key in element)
在所有这些循环的开头。
所以即使你不使用for..in循环也不要这样做。
答案 1 :(得分:2)
是否是坏事是值得商榷的,我非常喜欢@kangax在本文中给出的观点:
首先,他将主机和原生对象的扩展分开,主机对象没有保证,没有规范,也没有规则。
主机对象是环境提供的对象,它们不是ECMAScript规范的一部分,例如DOM对象。
扩展本机对象似乎“不那么危险”,他探讨了可枚举性的问题,这似乎是一个问题,for-in
语句枚举所有对象属性,继承或拥有,如果例如,在Object.prototype
上添加属性,此语句使用的任何对象都将显示属性名称。
此语句经常被滥用于迭代数组对象,而其目的是枚举对象属性。
最后,我认为本文的结论是鼓励将本机对象扩展为 shim 标准兼容方法(例如ES5数组方法(map,forEach,reduce等)),但是不鼓励扩展本机以添加自定义的非标准合规方法。
答案 2 :(得分:1)
问题通常来自其他库中的错误行为或不期望这些额外属性的代码。
你永远不应该触摸的是Object.prototype,因为它很有可能在for循环中破坏任何for ..但是数组通常在项目上循环,因此风险较小。
顺便说一句,您正在做的事情在某些浏览器(至少是Firefox)中可用作Array.prototype.indexOf答案 3 :(得分:0)
这不一定会导致问题,但如果您在生产环境中工作,则不建议这样做。通常的做法是不修改你没有创建的对象;看看http://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/
答案 4 :(得分:0)
首先,使用维护代码的人可能会发现某些代码的行为与她期望的不同。