在JavaScript中装饰一个对象并公开相同的签名

时间:2017-03-20 07:08:35

标签: javascript decorator

给出两个类:

function Example(){
this.methodOne = function(/* some args */){...};
this.methodTwo = function(/* some args */){...};
this.methodThree = function(/* some args*/){...};
}

function ExampleWrapper(example){
this.functionFour = function(...){...};    
this.wrapped = example;
}

其中ExampleWrapper获取Example的实例并将其包装以获得更多功能(装饰器模式)。

我希望能够从ExampleWrapper的实例调用Example的每个函数,而无需手动定义每个函数。 我的意思是,对于Example中的每个函数,我可以在ExampleWrapper

中执行以下操作
function ExampleWrapper(example){
...
this.methodOne = function(/* some args */){
    return this.wrapped.methodOne(/* same some args*/);
}
...
}

然后

var ex = new Example();
var wrap = new ExampleWrapper(ex);
wrap.methodOne(...)

但这不是很容易升级/整洁。

那么,我怎么能做到这一点? [猜测反思可能是要走的路,但我还不习惯使用它]

1 个答案:

答案 0 :(得分:0)

您是否尝试扩展原型?

function Example(){
}
Example.prototype.methodOne = function(/* some args */){console.log('1')};
Example.prototype.methodTwo = function(/* some args */){console.log('2')};
Example.prototype.methodThree = function(/* some args*/){console.log('3')};

function ExampleWrapper(example){
   this.functionFour = function(...){...};    
   this.wrapped = example;
}

ExampleWrapper.prototype = Example.prototype;

var test = new ExampleWrapper(new Example());
test.functionFour();
test.methodOne(...);