2013-08-30 53 views
0

在這種jsfiddle,作者爲一些定製敲除結合寫入一個測試。作爲測試的一部分,看起來他/她擴展了jquery。的Javascript倍率(或任何其他對象的)方法

我對30. $.fn.on = function(event, callback) {行的理解是,它覆蓋了,沒有後續清理任何jQuery可能在其原型上定義爲on的東西?第36行和fadeOut也是同樣的問題。

這裏的相關片段,你可以檢查小提琴尋找清理

30. $.fn.on = function(event, callback) { 
31. ... 
... 
36. $.fn.fadeOut = function(speed, callback) { 
37. ... 

我問在一般情況下,沒有直接關係的jQuery(即jQuery的可能會或可能不會有onfadeOut什麼。 )我正在考慮在生產代碼中嵌入一個類似的測試,我不希望我的測試改變jQuery或者我的測試可能以這種方式觸及的任何「真實」對象。在那個筆記上,似乎即使有清理,一些其他事件驅動(異步)調用可能會遇到更改的實現 - 我說得對嗎?

回答

1

它不僅覆蓋原型中定義的任何東西,而且實際上會替換它。 $.fn屬性是jQuery對象原型的副本,因此$.fn是實際原型,即$.fn === jQuery.prototype

你是正確的,你不能將這樣的改變隔離到你自己對對象的調用中,只要你的改變生效,它也會影響任何其他調用對象的代碼。

但是,由於jQuery是嚴格單線程的,您可以更改原型,使用該對象,然後更改原型,並且不會影響其他代碼。只要您的代碼不間斷地運行,就不會處理任何事件。

+0

謝謝 - 很好的答案。首先構建我的新「測試」元素,然後只改變他們自己的原型的方法是否會更好/更孤立? –

+0

@ G.Stoynev:如果你的意思是jQuery對象的原型,那麼對於所有實例只有一個原型(這適用於所有對象類型),所以不會更孤立。 – Guffa

0

是的,它覆蓋了jQuery的原型。它沒有擴展任何內容,$.fn是jQuery原型的別名(line 54 of core.jsjQuery.fn = jQuery.prototype = {...}),所以覆蓋$.fn.on就吹走了jQuery。

在這裏觀看日誌:http://jsfiddle.net/LzGmJ/

相關問題