如何解决在装饰器模式中实现委托
如何将调用委派给包装对象 - 除了我更改的功能:
class Base {
doSomething() {}
doOtherSomething() {}
doOtherSomething2() {}
}
class Decorator {
constructor(wrapped) {
this.wrapped = wrapped;
}
doSomething() {
console.log("doing more stuff");
this.wrapped.doSomething()}
}
}
如何委托其他函数在基类上自动调用?
解决方法
假设您说的是一般意义上的包装(而不是几年来的各种装饰器提案),最简单的方法是根本不使用包装器。相反,要么:
- 使用子类(如果您想对一类对象执行此操作),或
- 将原始对象上的方法替换为您的替换对象,该方法调用您替换的原始对象(如果您想为单个对象执行此操作)。
#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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。