2014-02-12 68 views
6

我在使用jQuery和原生JavaScript(而不是 prototype.js)时遇到问题。当使用以下代码时,jQuery 1.9.1出现错误消息:jQuery与原生原型的冲突

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对象原型。

+0

你能为我们提供一个小提琴 –

+0

可能的重复[原型对象在JavaScript中断jQuery?](http://stackoverflow.com/questions/1827458/prototyping-object-in-javascript-breaks-jquery) – Alnitak

回答

10

您可以通过你的扩展本机原型,不可枚举避免这些问题:

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

Object.defineProperty文档上MDN

正如扬德沃夏克提到的,这种解决方案不老的浏览器工作(IE8-)。

+0

Doesn'但在旧的IE工作,但。 –

+0

传奇!感谢分享这个。 –

2

还有没有安全的方式在旧版浏览器中扩展Object.prototype而不会破坏jQuery。 jQuery作者特别说(某处......),如果您只是将新的可枚举属性添加到Object.prototype,jQuery将会中断。

唯一安全方式需要的ECMAScript 5,其Object.defineProperty功能,这允许不可枚举属性被添加到对象。

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