5

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

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

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

4

1 回答 1

2

在 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
}
于 2012-08-14T13:59:51.750 回答