質問

JavaScriptの共通操作は、まだオリジナルのメソッドを呼び出しながら、オブジェクトメソッドを新しいものと置き換えることです。これはこのようにしばしば行われます:

var originalMethod = obj.method;
obj.method = function(arg) {
    // call original method
    originalMethod.call(this, arg);
    // do my stuff new stuff
}
.

チェンジ部を処理する特定のオブジェクトメソッドのためのユーティリティ機能を作成したいのですが、ユーザーがそれについて心配する必要がないようにします。1つの選択肢は、上記の設計を使用することで、追加された各関数は前のものを呼び出す新しい関数で折り返されます。もう1つのオプションは、関数の配列を作成し、オブジェクトメソッドを配列の上に繰り返すだけで、各関数を順番に呼び出すことです。

function addXyzMethod1(fn) {
    if (obj.method) {
        var previousMethod = obj.method;
        obj.method = function(value) {
            value = previousMethod.call(this, value);
            return fn.call(this, value);
        };
    } else {
        obj.method = fn;
    }
}

function addXyzMethod2(fn) {
    if (obj._methodList) {
        obj._methodList.push(fn);
    } else if (obj.method) {
        obj._methodList = [obj.method, fn];
        obj.method = function(value) {
            for (var i = 0, n = obj._methodList.length; i < n; i++) {
                value = obj._methodList[i].call(this, value);
            }
            return value;
        };
    } else {
        obj.method = fn;
    }
}
.

この時点で、それぞれのトレードオフが偶数であると感じてから使用する方法を決定することはできません。だから私の質問は次のとおりです。これらの方法のどれが優れています(より自然な、または受け入れられた、または速い)、またはこれらの両方を改善する別の方法はありますか?

役に立ちましたか?

他のヒント

What you are trying to do is a JavaScript version of call super, which is described as a code smell by Martin Fowler.

I would suggest instead that you either

  1. Contain the "super" object instead of inheriting from it.
  2. Use template method, such as below

    templateMethod = function () {
         baseMethod();
         if (overrideMethod) {
              overrideMethod();
         }
    };
    

Other objects would call templateMethod. The overrideMethod is where child objects would have their code.

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top