我試圖覆蓋this jQuery plugin中的一個方法,該方法遵循在Smashing Magazine article中引用的「jQuery輕量級插件樣板」模式,但是我似乎錯過了一些東西。 [編輯:原來的模式故意使該方法私人。]如何覆蓋這個jQuery插件的私有方法?
$.fn.mbp
存在,當我測試它。但是,當我使用以下語法重寫其方法之一時,沒有錯誤,並且插件方法未被覆蓋。
$.fn.mbp.loadFiles = function() {
alert('test')
};
我試圖覆蓋this jQuery plugin中的一個方法,該方法遵循在Smashing Magazine article中引用的「jQuery輕量級插件樣板」模式,但是我似乎錯過了一些東西。 [編輯:原來的模式故意使該方法私人。]如何覆蓋這個jQuery插件的私有方法?
$.fn.mbp
存在,當我測試它。但是,當我使用以下語法重寫其方法之一時,沒有錯誤,並且插件方法未被覆蓋。
$.fn.mbp.loadFiles = function() {
alert('test')
};
正如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() {
// ...
}
然而,這是不是一個真正的非常乾淨的解決方案,所以你可能會想別的辦法;)
插件使用該appoach:
(function ($) {
function MBP() {
// ...
}
MBP.prototype.loadFiles = function() {
// ...
};
$.fn.mbp = function() {
return this.each(function() {
var mbp = new MBP();
// ...
});
};
})(jQuery)
底線:由於封閉功能,MBP構造函數是私有的。你不能修改它(至少不需要修改插件的源代碼)。
您必須確保您的代碼在插件代碼之後運行,從而確保它被覆蓋。這樣做的一種方式是登錄您的控制檯,另一個方法是使用中斷點和測試是否在您之前或之後點擊您的代碼。另外,我注意到您正在調用mbp
,而鏈接中提到的功能是MBP
.Notice案例difference.Hope它有幫助
謝謝,是的,我測試了訂單。你會注意到插件底部附近調用$('...')。mbp()來初始化。 – simesy
此方法有用,謝謝!不是非常漂亮,但對於「及時」修復非常有用,無需維護大量新代碼。 – simesy
你是對的!沒想到這一點。 – Tomalak