修改JS核心对象是不是很糟糕?

时间:2011-08-21 08:04:40

标签: javascript

  

可能重复:
  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

5 个答案:

答案 0 :(得分:4)

是的,在修改所谓的主机对象时,行为是未定义的。它可能会起作用(通常它适用于像Array,String和Object这样的对象),它可能会破坏它。

但是,您应该从不修改prototypeArray的{​​{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)

首先,使用维护代码的人可能会发现某些代码的行为与她期望的不同。