我正在尝试将一个函数分配给Object.prototype.equals,类似于Object comparison in JavaScript中的函数。该函数运行正常,但每当我有jQuery时,我都会遇到如下错误:
name.replace不是函数
引用jquery-1.6.1.js中的第6490行。
有谁知道为什么会发生这种情况?
答案 0 :(得分:5)
不要追逐补丁Object.prototype
。
Object.prototype.replace = "lol";
for (var i in { "bar": 42 }) {
alert(i);
}
// "bar"
// "replace" :(
基本上for ... in
循环遍历对象中的所有属性,包括在原型上定义的属性。这就是为什么扩展或更改Object.prototype
非常糟糕的做法。
有些人还会选择“不要追逐Array
,String
,Function
,......”。
你应该永远混淆Object.prototype
。其余的原生原型是一种风格选择。
在Object
上定义您的功能。
Object.replace = function() { ... };
var o = Object.replace(p);
<强> ES5:强>
使用ecmascript 5,您可以将属性设置为不可枚举
Object.defineProperty(Object.prototype, "replace", {
value: function() { }
});