JavaScript:是否可以替换像Array.prototype.indexOf这样的函数?

时间:2014-08-06 15:56:35

标签: javascript prototype

正如问题所说, 是否可以用自己的实现替换这些函数?

像:

Array.prototype.forEach = function () {
    console.log("foo");             
};                         

那是 - 当然 - 一个愚蠢的替代品。但这更多是关于这种可能性。我尝试过,但是在运行时它似乎没有被替换。

我的控制台记录foo。但是,当我打电话给

[].forEach();

也喊出日志foo,它不起作用,直到我在控制台中再次替换forEach函数。

2 个答案:

答案 0 :(得分:6)

您的示例有效:

Array.prototype.forEach = function () {
    alert("foo");             
};    

[].forEach();

http://jsbin.com/xidew/1/

这最终是不受欢迎的。您正在改变应用程序和库工作的基本功能。如果你确实改变了这些功能,你必须小心不要破坏现有功能依赖它们的方式。

查看underscore.js编辑方式forEach

您可以看到他们通过创建单独的forEach函数来避免更改每个数组使用_.forEach()的方式。

然后其他库(如Backbone)接受forEach并仅覆盖其数组的子类。与Backbone一样,它会覆盖Backbone集合中的forEach方法。

这个故事的寓意是:

极少见的情况是修改基础对象类的原型StringArrayObject,因为它可能具有灾难性的影响。如果需要,可以创建这些基类的子类并在那里修改它以满足您自己的目的。这种子类化策略在Backbone和其他流行且广泛使用的js库中很明显。

答案 1 :(得分:0)

您可以做的是将代码添加到外部文件default.js中,并将脚本标记添加到布局html(其余所有页面使用的主页面)

<head>
    <title>Title</title>
    <link href="Content/default.css" rel="stylesheet" />
    <script src="Scripts/default.js"></script>
</head>

它将始终被其他js代码拾取,因为它将始终加载到页面中。