jQuery与本机原型冲突



我在使用原生JavaScript(不是原型.js)中使用jQuery时遇到问题。使用以下代码时,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的插件中,因此出于兼容性原因,它必须与旧版本一起使用。

是否有任何已知问题或解决方法?

谷歌搜索实际上向我展示了使用jQuery.noConflict()和私有函数包装等解决方案。但如上所述,我没有使用原型.js,而是使用本机JS对象原型。

您可以通过将本机原型的扩展设置为不可枚举来避免这些问题:

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

Object.defineProperty MDN 文档

正如Jan Dvorak所提到的,此解决方案不适用于旧浏览器(IE8-)。

在较旧的浏览器中,没有安全的方法可以在不破坏jQuery的情况下扩展Object.prototype。 jQuery的作者特别说(在某处...)如果你只是向Object.prototype添加新的可枚举属性,jQuery就会中断。

唯一安全的方法需要 ECMAScript 5 及其Object.defineProperty函数,它允许将不可枚举的属性添加到对象中。

jQuery noconflict()函数没有帮助 - 它是一个完全不同的问题的解决方案。

最新更新