5

私はここで賢くなろうとしています。他のクラスのインスタンスをラップし、1 つまたは 2 つのメソッドをオーバーライドするが、他のすべてのメソッド呼び出しをデリゲート オブジェクトに直接渡すクラスを作成するとします。

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

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

デリゲートに他の 100 のメソッド (誇張、許可) がある場合、ラッパーでそれぞれのメソッドを定義することはできませんが、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で指定された1つのメソッドをオーバーライドするとします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 に答える