• 在Javascript中动态的给对象添加职责的方式称作装饰者模式。
  • 下面我们通常遇到的例子:
var a = function () {
alert(1);
};
//改成:
var a = function () {
alert(1);
alert(2);
};
  • 用装饰者模式,在不改原来函数的基础上,我们增加自己的新功能。
        var a = function () {
alert(1);
};
var _a=a;
a=function(){
_a();
alert(2);
}
a();
 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 AtomDecorator = function (plane) {
this.plane = plane;
};
AtomDecorator.prototype.fire = function () {
this.plane.fire();
console.log("发射原子弹");
};
var plan = new Plane();
plan = new MissileDecorator(plan);
plan = new AtomDecorator(plan); plan.fire();
/*
发射普通子弹
发射导弹
发射原子弹
*/
  • 这种给对象动态增加职责的方式,并没有真正地改动对象自身,而是将对象放入另一个对象之中,这些对象以一条链的方式进行引用,形成一个聚合对象。
var plane = {
fire: function () {
console.log('发射普通子弹');
}
};
var missileDecorator = function () {
console.log("发射导弹");
};
var atomDecorator = function () {
console.log("发射原子弹");
}; var fire1 = plane.fire;
plane.fire = function () {
fire1();
missileDecorator();
}
var fire2 = plane.fire;
plane.fire = function () {
fire2();
atomDecorator();
} plane.fire();
/*
发射普通子弹
发射导弹
发射原子弹
*/
  • 我们在实际开发过程当中,想给window绑定onload事件,但是又不确定这个事件有没有被其他人已经给绑定过,
  • 为了避免覆盖掉原来的window.onload函数中的行为,我们就用装饰者模式,先将原来的函数保存起来,再把它放入新的函数中执行。
window.onload = function () {
alert(1);
};
var _onload = window.onload || function () { }; window.onload = function () {
_onload();
alert(2);
};

最新文章

  1. 巧用margin/padding的百分比值实现高度自适应(多用于占位,避免闪烁)
  2. windows下监测tomcat7内存使用情况
  3. JS表单验证插件(支持Ajax验证)
  4. 转载:Java面试笔试题大汇总
  5. Bootstrap:表格和栅格分页
  6. etcdctl --help
  7. HDU 1622
  8. 第二百九十九天 how can I 坚持
  9. 《Java程序员面试宝典》读书笔记1
  10. Samba 安全漏洞
  11. iOS 实现脉冲雷达以及动态增减元素 By Swift-感谢分享
  12. java学习之数组排序一:选择排序
  13. forEach遍历对象数组案例
  14. 【输入输出挂】【Uva11462】Age Sort
  15. org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'springSessionRepositoryFilter' is defined
  16. Java的Log系统介绍和切换(转)
  17. Android Material Design控件使用(一)——ConstraintLayout 约束布局
  18. Go开发之路 -- 流程控制
  19. oracle 11g RAC日志分布
  20. RHEL7 下双网卡绑定做主备(冗余)

热门文章

  1. solr home 目录设置
  2. Unity中溶解shader的总结
  3. Java引领新生活
  4. DBMS
  5. Python中三种基本结构的语句
  6. git pull错误记录及解决
  7. Spring:利用PerformanceMonitorInterceptor来协助应用性能优化
  8. 当在浏览器地址栏里输入URL后会发生什么事情
  9. 关于SQL的一些小知识
  10. 菜鸟学IT之IP基础