2014-02-12 111 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()函數沒有幫助 - 它是一個完全不同的問題的解決方案。