jQuery与原生原型冲突

我在使用jQuery和原生JavaScript( NOT 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的插件,因此出于兼容性原因,它必须使用旧版本。

是否有任何已知问题或修复此问题?

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

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

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

MDN上的 Object.defineProperty文档

正如Jan Dvorak所说,这个解决方案不适用于旧浏览器(IE8-)。

旧版浏览器没有安全的方法来扩展Object.prototype而不破坏jQuery。 jQuery作者特别说(某处……)如果你只是向Object.prototype添加新的可枚举属性,jQuery就会破坏。

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

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