JS 設計模式九 -- 裝飾器模式
阿新 • • 發佈:2019-04-23
裝飾者 class name 概念 nload value 執行 pass 裝飾類
概念
裝飾者(decorator)模式能夠在不改變對象自身的基礎上,動態的給某個對象添加額外的職責,不會影響原有接口的功能。
模擬傳統面向對象語言的裝飾者模式
//原始的飛機類 var Plane = function () { }; Plane.prototype.fire = function () { console.log(‘發射普通子彈‘); }; //裝飾類 var MissileDecorator = function (plane) { this.plane = plane; } MissileDecorator.prototype.fire= function () { this.plane.fire(); console.log(‘發射導彈!‘); }; var plane = new Plane(); plane = new MissileDecorator(plane); plane.fire();
JavaScript中的裝飾器模式
var Plane = { fire: function () { console.log(‘發射普通的子彈‘); } }; var missileDecorator= function () { console.log(‘發射導彈!‘); }; var fire = Plane.fire; Plane.fire=function () { fire(); missileDecorator(); }; Plane.fire();
對 window.onload 進行裝飾例子
window.onload=function () { console.log(‘onload‘); }; var _onload= window.onload || function () {}; window.onload=function () { _onload(); console.log(‘自己的處理函數‘); };
使用AOP(面向切面編程)裝飾函數
主要是以為在JavaScript中會存在隨著函數的調用,this
的指向發生變化,導致執行結果發生變化。
封裝before函數
在需要執行的函數之前執行某個新添加的功能函數
//是新添加的函數在舊函數之前執行 Function.prototype.before=function (beforefn) { var _this= this; //保存舊函數的引用 return function () { //返回包含舊函數和新函數的“代理”函數 beforefn.apply(this,arguments); //執行新函數,且保證this不被劫持,新函數接受的參數 // 也會被原封不動的傳入舊函數,新函數在舊函數之前執行 return _this.apply(this,arguments); }; };
封裝 after 函數
在需要執行的函數之後執行某個新添加的功能函數
//新添加的函數在舊函數之後執行 Function.prototype.after=function (afterfn) { var _this=this; return function () { var ret=_this.apply(this,arguments); afterfn.apply(this,arguments); return ret; }; };
表單驗證
Function.prototype.before=function (beforefn) { var _this= this; //保存舊函數的引用 return function () { //返回包含舊函數和新函數的“代理”函數 beforefn.apply(this,arguments); //執行新函數,且保證this不被劫持,新函數接受的參數 // 也會被原封不動的傳入舊函數,新函數在舊函數之前執行 return _this.apply(this,arguments); }; }; var validata=function () { if(username.value===‘‘){ alert(‘用戶名不能為空!‘) return false; } if(password.value===‘‘){ alert(‘密碼不能為空!‘) return false; } } var formSubmit=function () { var param={ username=username.value; password=password.value; } ajax(‘post‘,‘http://www.xxx.com‘,param); } formSubmit= formSubmit.before(validata); submitBtn.onclick=function () { formSubmit(); }
JS 設計模式九 -- 裝飾器模式