【问题标题】:Implementing delegation in decorator pattern在装饰器模式中实现委托
【发布时间】:2021-04-07 21:50:18
【问题描述】:

除了我更改的功能之外,我如何将调用委托给包装对象:

class Base {
    doSomething() {}
    doOtherSomething() {}
    doOtherSomething2() {}
}

class Decorator {
   constructor(wrapped) {
      this.wrapped = wrapped;
   }

    doSomething() { 
       console.log("doing more stuff");
       this.wrapped.doSomething()}
    }
}

如何委托其他函数在基类上自动调用?

【问题讨论】:

  • 哪种装饰器?到目前为止,至少已经提出了三个(四个?)。到目前为止,还没有人将其纳入规范。
  • 或者您在更一般的意义上使用“装饰器”?向我们展示您打算如何使用上述内容将有助于明确您的问题。
  • 旁注:您的class 示例不正确。不要在 class 构造中使用 function 关键字。
  • @T.J.Crowder 给定标签,OP 谈论的是decorator pattern,而不是注释语法
  • @Bergi - 是的,我最后也是这么想的。

标签: javascript design-patterns decorator


【解决方案1】:

假设您说的是一般意义上的包装(而不是已经流传了几年的各种装饰器提案),最简单的方法是根本不使用包装器。相反,要么:

  1. 使用子类(如果您想对一类对象执行此操作),或者
  2. 用您的替换替换原始对象上的方法,这会调用您替换的原始对象(如果您想为单个对象执行此操作)。

#2 看起来像这样:

function wrapDoSomething(obj) {
    const original = obj.doSomething;
    obj.doSomething = function(...args) {
        // Do something here, then:
        return original.apply(this, args);
    };
    return obj; // Optional/nice to have
}

现场示例:

class Base {
   doSomething() {
       console.log("Original doSomething");
   }
   doOtherSomething() {
       console.log("Original doOtherSomething");
   }
   doOtherSomething2() {}
}

function wrapDoSomething(obj) {
    const original = obj.doSomething;
    obj.doSomething = function(...args) {
        console.log("wrapper doSomething - doing something before");
        const result = original.apply(this, args);
        console.log("wrapper doSomething - doing something after");
        return result;
    };
    return obj;
}

const b = wrapDoSomething(new Base());
b.doSomething();
b.doOtherSomething();

【讨论】:

    猜你喜欢
    • 2012-11-03
    • 2012-02-16
    • 2011-03-08
    • 2019-03-25
    • 2019-10-07
    • 1970-01-01
    • 2018-12-23
    • 2018-03-10
    • 1970-01-01
    相关资源
    最近更新 更多