//模拟传统语言的装饰者
//原始的飞机类
var Plan = function () {
};
Plan.prototype.fire = function () {
console.log('发射普通子弹');
};
//装饰类
var MissileDecorator = function (plan) {
this.plan = plan;
}
MissileDecorator.prototype.fire = function () {
this.plan.fire();
console.log('发射导弹!');
};
var plan = new Plan();
plan = new MissileDecorator(plan);
plan.fire();
var Plan1 = {
fire: function () {
console.log('发射普通的子弹');
}
};
var missileDecorator= function () {
console.log('发射导弹!');
};
var fire = Plan1.fire;
Plan1.fire=function () {
fire();
missileDecorator();
};
Plan1.fire();
//新添加的函数在旧函数之后执行
Function.prototype.after=function (afterfn) {
var _this=this;
return function () {
var ret=_this.apply(this,arguments);
afterfn.apply(this,arguments);
return ret;
};
};
2.3.不污染Function原型的做法
var before=function (fn, before) {
return function () {
before.apply(this,arguments);
return fn.apply(this,arguments);
};
};
function func1(){console.log('1')}
function func2() {console.log('2')}
var a=before(func1,func2);
// a=before(a,func1);
a();
声明:这个系列为阅读《JavaScript设计模式与开发实践》 ----曾探@著一书的读书笔记
装饰者模式的定义:
装饰者(decorator) 模式能够在不改变对象自身的基础上,在程序运行期间给对像动态的添加职责。与继承相比,装饰者是一种更轻便灵活的做法。
装饰者模式的特点:
可以动态的给某个对象添加额外的职责,而不会影响从这个类中派生的其它对象;
继承的一些缺点:
传统面向对象的装饰者和JavaScript装饰者对比:
1.模拟传统面向对象语言的装饰者模式
2.JavaScript中的装饰者模式
装饰函数
在JavaScript中可以很方便的给某个对象扩展属性和方法,但却很难在不改动某个函数源代码的情况下,给该函数添加一些额外的功能。也就是在代码运行期间,我们很难切入某个函数的执行环境。
1.使用装饰者模式例子
2.使用AOP(面向切面编程)装饰函数
主要是以为在JavaScript中会存在随着函数的调用,
this
的指向发生变化,导致执行结果发生变化。2.1.封装的before函数
在需要执行的函数之前执行某个新添加的功能函数
2.2.封装的after函数
在需要执行的函数之后执行某个新添加的功能函数
2.3.不污染Function原型的做法
装饰者模式用法示例:
1.ajax动态添加参数
使用装饰者模式动态的改变ajax函数,传输的参数
2.表单验证并且提交
装饰者模式分离表单验证和提交的函数
总结:
装饰者模式和代理模式的区别: