jQuery与本地原型冲突

7

我在使用jQuery和本地JavaScript(而不是prototype.js)时遇到问题。在使用以下代码时,jQuery 1.9.1出现错误信息:

Object.prototype.myVeryGreatFunction = function() {
    // ...
}

[Error] TypeError: undefined is not a function (evaluating 'U[a].exec(s)')
ft (jquery.min.js, line 4)
wt (jquery.min.js, line 4)
st (jquery.min.js, line 4)
find (jquery.min.js, line 4)
init (jquery.min.js, line 3)
b (jquery.min.js, line 3)
(anonymous function) (read.control.js, line 59)
c (jquery.min.js, line 3)
fireWith (jquery.min.js, line 3)
ready (jquery.min.js, line 3)
H (jquery.min.js, line 3)

当我删除原型定义时,一切运作良好。不幸的是,我不能轻易更新jQuery,因为它是CMS插件,必须与旧版本配合工作以保持兼容性。是否有已知的问题或修复方法?Google搜索实际上向我展示了解决方案,例如使用 jQuery.noConflict()和私有函数包装。但正如上面所提到的,我没有使用prototype.js,而是使用本地JS对象原型。

你可以提供一个 JSFiddle 吗? - Shaik Mahaboob Basha
可能是在JavaScript中原型化对象会破坏jQuery?的重复问题。 - Alnitak
2个回答

13

通过将您对本地原型的扩展设置为非枚举,您可以避免这些问题:

Object.defineProperty(Object.prototype, 'myVeryGreatFunction',{
  value : function() {},
  enumerable : false
});

Object.definePropertyMDN 的文档。

正如 Jan Dvorak 所提到的,这个解决方案对于旧浏览器(IE8-)不起作用。


传奇!感谢分享。 - Stuart Nelson

3
在旧版浏览器中,没有安全的方法可以扩展`Object.prototype`而不破坏jQuery。jQuery作者明确表示(某处...)如果您只是向`Object.prototype`添加新的可枚举属性,则jQuery将无法使用。

唯一安全的方法需要ECMAScript 5及其`Object.defineProperty`函数,该函数允许将非枚举属性添加到对象中。
jQuery的`noconflict()`函数无法解决这个问题-它是完全不同问题的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接