2015-09-14 50 views
0

我試圖覆蓋this jQuery plugin中的一個方法,該方法遵循在Smashing Magazine article中引用的「jQuery輕量級插件樣板」模式,但是我似乎錯過了一些東西。 [編輯:原來的模式故意使該方法私人。]如何覆蓋這個jQuery插件的私有方法?

$.fn.mbp存在,當我測試它。但是,當我使用以下語法重寫其方法之一時,沒有錯誤,並且插件方法未被覆蓋。

$.fn.mbp.loadFiles = function() { 
    alert('test') 
}; 

回答

2

正如Tomalak說,他們的功能受到保護,但它不是遙不可及。
因爲它將mbp對象的實例存儲在jquery數據存儲中,所以我們可以獲取此對象的構造函數並覆蓋該函數。

從你的代碼行360:

$.fn[pluginName] = function (options) { 
    return this.each(function() { 
     if (!$.data(this, 'plugin_' + pluginName)) { 
     $.data(this, 'plugin_' + pluginName, 
      new MBP(this, options)); 
     } 
     else { 
     if (options == 'options') { 
      return $.data(this, 'plugin_' + pluginName).options; 
     } 
     } 
    }); 
    } 

覆蓋它:

$.data($('<div/>').mbp()[0], 'plugin_mbp').constructor.prototype.loadFiles = function() { 
    // ... 
} 

然而,這是不是一個真正的非常乾淨的解決方案,所以你可能會想別的辦法;)

+0

此方法有用,謝謝!不是非常漂亮,但對於「及時」修復非常有用,無需維護大量新代碼。 – simesy

+0

你是對的!沒想到這一點。 – Tomalak

1

插件使用該appoach:

(function ($) { 
    function MBP() { 
     // ... 
    } 
    MBP.prototype.loadFiles = function() { 
     // ... 
    }; 
    $.fn.mbp = function() { 
     return this.each(function() { 
      var mbp = new MBP(); 
      // ... 
     }); 
    }; 
})(jQuery) 

底線:由於封閉功能,MBP構造函數是私有的。你不能修改它(至少不需要修改插件的源代碼)。

+0

這是我的懷疑......這對我來說似乎是一個愚蠢的模式! – simesy

+0

這是不完全正確的 - 你可以覆蓋它(見我的答案)。 – jantimon

+0

@simesy不,它絕對不是一個愚蠢的模式。作爲一名插件開發人員,您希望保持全局名稱空間的清潔。這意味着你將所有的東西包裝在它自己的範圍內,這樣它就不會被暴露,也不會與任何其他代碼發生衝突。 – Tomalak

0

您必須確保您的代碼在插件代碼之後運行,從而確保它被覆蓋。這樣做的一種方式是登錄您的控制檯,另一個方法是使用中斷點和測試是否在您之前或之後點擊您的代碼。另外,我注意到您正在調用mbp,而鏈接中提到的功能是MBP.Notice案例difference.Hope它有幫助

+0

謝謝,是的,我測試了訂單。你會注意到插件底部附近調用$('...')。mbp()來初始化。 – simesy