我知道我差不多三年晚了,但希望這個問題的未來讀者能從我的回答中受益。 GSto從jQuery插件設計的角度看起來很不錯,但有一個小問題:調用mynamespace()
用新方法調用返回的jQuery實例。這裏是作爲一個問題的例子:
$myDiv = $('.mydiv');
$myDiv.mynamespace().height(); // this will be `height' from mynamespace
$myDiv.height(); // this will STILL be `height' from mynamespace
// because it has overwritten $myDiv.height
所選擇的答案沒有這個問題,因爲有amtec()
不是一個jQuery的實例,反而調用它與jQuery的實例作爲上下文方法的對象。我已經採取了概念從兩個答案,下面寫的命名空間插件:
(function($) {
$.namespace = function(namespaceName, closures) {
if ($.fn[namespaceName] === undefined) {
$.fn[namespaceName] = function executor(context) {
if (this instanceof executor) {
this.__context__ = context;
}
else {
return new executor(this);
}
};
}
$.each(closures, function(closureName, closure) {
$.fn[namespaceName].prototype[closureName] = function() {
return closure.apply(this.__context__, arguments);
};
});
};
})(jQuery);
用法示例:
$.namespace('milosz', {
redify: function() {
$(this).css('color', '#ff0000');
},
greenify: function() {
$(this).css('color', '#00ff00');
}
});
$.namespace('milosz', {
blueify: function() {
$(this).css('color', '#0000ff');
}
});
$('.mydiv').milosz().redify(); // The HTML elements with class `mydiv' are now red
該代碼使用JavaScript的一些非常低級別的細節由John Resig's Advanced JavaScript tutorial是很好解釋的,但嚴格意義上是什麼在發生的例子是這樣的:
當milosz
(內部$.fn[namespaceName]
)被調用,this
指向jQuery
實例返回b y $('.mydiv')
。因此,if
聲明落入else
塊,並調用構造函數版本milosz
(由於原因即將變得明顯,因此在內部引用爲executor
)。構造函數傳遞一個參數:this
,指向jQuery
實例的指針,該實例將作爲milosz
名稱空間的所有成員的執行上下文。我們回到if
聲明中,這次執行第一個塊,其中傳入的jQuery
實例存儲在名爲__context__
(希望被覆蓋的可能性很低)的成員變量中。返回構造的對象,並完成對原始jQuery
實例的引用,並通過調用$.namespace
將其添加到其原型的任何包裝器。這些包裝只是執行傳遞到milosz
名稱空間的方法,並將原始jQuery
對象作爲上下文執行,如執行redify
時發生的那樣。
嗯,我知道這是一口,無論如何,它的作用就像接受的答案,但看起來像jQueryish的答案,這對我來說是兩全其美。
請問你看看我的解決方案。對你想要達到的目標更準確。 – 2014-10-28 16:45:41