修改JS核心对象不好吗



可能重复:
修改JavaScript';内置原型?

我刚刚了解到可以修改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;
};

这是一篇文章:高级Javascript:对象、数组和类数组对象

是的,当修改所谓的主机对象时,行为是未定义的。它可能会起作用(通常适用于Array、String和Object等对象(,也可能会破坏事物。

但是,您应该永远不要修改ArrayObjectprototype,因为它会破坏数组和对象的for(var key in element),除非在所有循环的开头包含if(!element.hasOwnProperty(key)) continue;。所以永远不要这样做,即使你不使用。。在循环中。

是否糟糕是有争议的,我真的很喜欢@kangax在这篇文章中给我们的观点:

  • 扩展内置的本机对象。邪恶与否

首先,他分离了主机本机对象的扩展,对于主机对象,没有保证,没有规范,也没有规则。

主机对象是由环境提供的对象,它们不是ECMAScript规范的一部分,例如DOM对象。

扩展本机对象似乎"不那么危险",他探讨了可枚举性的问题,这似乎是一个问题,for-in语句枚举了所有继承或拥有的对象属性,例如,如果在Object.prototype上添加属性,则与该语句一起使用的任何对象都将显示属性名称。

此语句经常被滥用来在数组对象上迭代,而其目的是枚举对象属性。

最后,我认为本文的结论是,鼓励将本机对象扩展到shim标准兼容方法(例如ES5数组方法(map、forEach、reduce等((,但不鼓励扩展本机对象以添加自定义的非标准兼容方法。

这些问题通常来自于其他库或代码中的错误行为,而这些库或代码不需要这些额外的属性。

你永远不应该碰的是Object.prototype,因为它很有可能破坏。。在循环中,但数组通常在项上循环,因此风险较小。

顺便说一句,你正在做的事情在一些浏览器(至少是Firefox(中可用,如Array.prototype.indexOf

这不一定会导致问题,但如果您在生产环境中工作,则不建议这样做。总的来说,一般做法是不修改未创建的对象;看看http://www.nczonline.net/blog/2010/03/02/maintainable-javascript-dont-modify-objects-you-down-own/

例如,使用维护代码的人可能会因为看到某些代码的行为与她预期的不一样而抓狂。

最新更新