JavaScript对象实例委派/转发

时间:2012-08-14 13:43:17

标签: javascript node.js

我想在这里变得聪明。假设我写了一个包装其他类的实例的类,重写了一个或两个方法,但是将所有其他方法调用直接传递给了委托对象。

function Wrapper(delegate) {
  this._delegate = delegate;
}

Wrapper.prototype.example = function() {
  console.log('Doing something in wrapper');
  this._delegate.example();
};

如果委托有100个其他方法(夸大,授予),而不是在我的Wrapper中为每个方法定义一个方法,那么在JavaScript中有一种优雅的方法吗?

我考虑过在实际情况下进行方法调整/代理,即

Wrapper.wrap = function(delegate) {
    var example = delegate.example;
    delegate.example = function() {
      example.call(this, arguments);
      console.log('Forwarded an overridden method call!');
    };
    return delegate;
};

但我不想修改实例,如果可以避免的话。

1 个答案:

答案 0 :(得分:1)

在javascript中扩展对象的一般方法不是以你完成的方式包装它,而是要求你将每个方法调用转发给实际的对象。因此,除非您有特定的理由被迫这样做,否则只需向现有对象添加新方法和属性就好了。然后,所有现有的方法和属性“只是工作”,而不必做任何特殊的事情。如果要替换某些方法,可以提供自己的实现,但所有以前存在的方法都将继续工作。

假设您有一个名为foo的现有对象,并且您希望覆盖一个名为create()的方法。你可以这样做:

foo.origCreate = foo.create;
foo.create = function(x, y) {
    // do whatever you want here in the override
    // including calling the origCreate method if you want
}