浅谈JavaScript设计模式——装饰者模式

淡淡的烟草味﹌ 2022-07-03 12:56 276阅读 0赞

在不改变原对象的基础上,通过对其进行包装扩展(添加属性或方法),使原有对象可以满足用户的更复杂需求,满足开闭原则,也不会破坏现有的操作。

适用场景:当遇到新的功能或需求需要对原来的操作做出更改时,若原来的操作比较复杂,可以把原来的操作原封不动地放在装饰者中,然后再添加新功能。

eg1:

  1. function Person() {
  2. }
  3. Person.prototype.sayHello = function() {
  4. console.log('Hello, Alice!');
  5. };
  6. function Decorator(param) {
  7. this.person = param;
  8. }
  9. Decorator.prototype.sayHello = function() {
  10. this.person.sayHello();
  11. console.log('Hello, Bruce!');
  12. };
  13. Decorator.prototype.sayGoodbye = function() {
  14. console.log('Bye, everyone!');
  15. };
  16. new Decorator(new Person()).sayHello();
  17. /*
  18. 输出:
  19. Hello, Alice!
  20. Hello, Bruce!
  21. */
  22. new Decorator(new Person()).sayGoodbye();
  23. /*
  24. 输出:
  25. Bye, everyone!
  26. */

没有改变原有的构造函数对象,而是原封不动地拿过来,再添加新的方法。

eg2:

  1. var div = document.getElementById('div');
  2. div.onclick = function() {
  3. console.log('First click!');
  4. }
  5. var decorator = function() {
  6. var args = arguments;
  7. var element = document.getElementById(args[0]);
  8. if (typeof element.onclick === 'function') {
  9. var firstClick = element.onclick;
  10. element.onclick = function() {
  11. firstClick();
  12. args[1]();
  13. }
  14. }
  15. else
  16. element.onclick = args[1];
  17. }
  18. decorator('div', function() {
  19. console.log('Second click!');
  20. });
  21. /*
  22. 输出:
  23. First click!
  24. Second click!
  25. */

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读