Javascript中的原型对象打破了jQuery?

我已经添加了一个简单的.js文件到我的页面,有一些漂亮的普通任务types的function添加到ObjectArray原型。

通过试验和错误,我已经find了将任何函数添加到Object.prototype ,不pipe它的名称或它是什么导致jQuery中的Javascript错误:

罪魁祸首?

 Object.prototype.foo = function() { /*do nothing and break jQuery*/ }; 

在attr:function {}声明中,我得到的错误是jquery-1.3.2.js 1056行:

 /*Object doesn't support this property or method*/ name = name.replace(/-([az])/ig, function(all, letter) { return letter.toUpperCase(); }); 

显然G.replace是未定义的。

虽然很明显,我只是没有用原型来包装我的东西,但是我很难弄清楚它是什么。

要清楚,我不是在寻找解决方法,我已经处理了…我在寻找的是对为什么的答案 。 为什么向Object.prototype添加一个函数会破坏这段代码?

你永远不应该扩展Object.prototype 。 它远不止于jQuery; 它完全打破了Javascript的“对象 – 哈希表”function。 不要这样做。

你可以问John Resig,他会告诉你同样的事情 。

如果它只是一个混乱的情况下…在循环中,你不能使用Object.defineProperty来添加你的FN,而不是让它枚举?

所以:

 Object.defineProperty(Object.prototype, "foo", { value: function() { // do stuff }, enumerable : false }); 

似乎为我工作。 这仍然被认为是不好的forms?

我同意,添加一些Object.prototype需要谨慎,应该避免。 寻找其他解决scheme,如:

将其添加到Object,然后根据需要使用callapply访问它。 例如:

 Object.foo = function () { return this.whatever()} 

然后通过以下方式在对象上调用它:

 Object.foo.call(Objname); // this invokes the function as though it were a // method of Objname. That is, its like Objname.foo() 

为了好玩,你可以添加以下(是的,我知道它有点危险…):

 Function.using = Function.call; // syntactic sugar 

现在你可以编写Object.foo.using(Objname) ,它读起来就像一个感觉。

但作为一个规则,远离改变任何大型原型。

我在这个问题上敲了敲头,因为我希望在所有的对象中实现“真正的”对象定位,例如:

 interface Object { GetType: () => string; ToString: () => string; GetHashcode: () => number; Equals: (obj: any) => boolean; } 

由于Object.prototype违反了JQuery,我默认使用defineProperty来解决上述问题,但是没有任何参数。

好消息是你可以进入defineProperty并实际接受参数。 这是我的实现:

 Object.defineProperty(Object.prototype, "Equals", { value: function (obj: any) { return obj == null && this == null ? true : obj != null && this == null ? false : obj == null && this != null ? false : this.GetHashcode() == obj.GetHashcode(); }, enumerable: false }); 

这工作,并不与JQuery冲突。

我怀疑添加一个函数来Object.prototype直接打破jQuery。 只要确保每个for..in循环中你有整个站点被包装在一个hasOwnProperty检查,因为你已经在全球范围内添加该函数,迭代的结果可能是不可预知的:

 Object.prototype.foo = function() {}; var myObject = {m1: "one", m2: "two" }; for(var i in myObject) { if(myObject.hasOwnProperty(i)) { // Do stuff... but not to Object.prototype.foo }}