JavaScript对象实例委派/转发

JavaScript对象实例委派/转发,javascript,node.js,Javascript,Node.js,我想在这里变聪明。假设我编写了一个类,它封装了某个其他类的实例,重写了一个或两个方法,但将所有其他方法调用直接传递给委托对象 function Wrapper(delegate) { this._delegate = delegate; } Wrapper.prototype.example = function() { console.log('Doing something in wrapper'); this._delegate.example(); }; 如果委托有100

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

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

Wrapper.prototype.example = function() {
  console.log('Doing something in wrapper');
  this._delegate.example();
};
如果委托有100个其他方法(夸张,是肯定的),而不是在我的包装器中为每个方法定义一个方法,那么在JavaScript中有没有一种优雅的方法可以做到这一点

我只考虑了在实际实例上使用swizzling/proxying方法,即

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

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

在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
}

看起来你想要的是。。。他们很快就会来;)迭代委托的属性很容易,问题是
Wrapper
应该是泛型的还是特定委托类型的。你想在包装器方法中做什么?@FelixKling谢谢你的链接!我说的“很快”是指ECMAScript 6。。。