定義
裝飾者模式能夠在不改變對象自身的基礎(chǔ)上,在程序運行期間給對象動態(tài)地增加職責(zé)。
要點
- 傳統(tǒng)的裝飾者模式狮杨,將對象放入到另一個對象之中,這些對象以一條鏈的方式進行引用到忽。這些對象都擁有相同的接口橄教,當(dāng)請求到達鏈中的某個對象時,這個對象會執(zhí)行自身的操作喘漏,隨後把請求轉(zhuǎn)發(fā)給鏈中的下一個對象护蝶。
- 裝飾函數(shù):在不改變函數(shù)源代碼的情況下,能給函數(shù)增加功能翩迈。
- 如果不喜歡 Function.prototype.before 和 Function.prototype.after 這種汙染原型的方式持灰,可以定義 before 和 after 方法,接受原函數(shù)和新函數(shù)作為參數(shù)负饲。
- 裝飾函數(shù)的應(yīng)用實例:分離業(yè)務(wù)代碼和數(shù)據(jù)統(tǒng)計代碼堤魁;改變函數(shù)的參數(shù);插件式的表單驗證返十。
- 裝飾函數(shù)返回的是一個新函數(shù)妥泉,如果在原函數(shù)上保存了一些屬性,那麼這些屬性會丟失洞坑。
- 裝飾者模式和代理模式的結(jié)構(gòu)相似盲链,都保留了對另外一個對象的引用,並且向那個對象發(fā)送請求。兩者最重要的區(qū)別在於意圖和設(shè)計目的不同刽沾。代理模式的本體提供了關(guān)鍵功能本慕,而代理提供或拒絕對它的訪問,或者在訪問前做一些額外的事情悠轩,本體和代理間是一種靜態(tài)的關(guān)係间狂;裝飾者模式的目的則是為對象動態(tài)加入行為。
核心代碼
Function.prototype.before(beforeFn) {
var self = this;
return function() {
beforeFn.apply(this, arguments);
return self.apply(this, arguments);
};
}
var before = function(fn, beforeFn) {
return function() {
beforeFn.apply(this, arguments);
return fn.apply(this, arguments);
};
};