0

そのため、私はJSで多くの作業を行っており、イベントでも多くの作業を行っています(可能な限りモジュール化するようにしてください)。現在、私はEvent.fire('eventName')すべての関数の最後に呼び出しています。Event.fire([function name])オブジェクト/クラス内の任意の関数がすべての関数の最後に自動的にを呼び出すようにする方法を探しています

例:

function MyClass(){
   this.on('someFunc', this.funcTwo);
   this.someFunc();
}
MyClass.prototype.on = function( event ){
   // the event stuff //
}
MyClass.prototype.someFunc = function(){
   console.log('someFunc');
}
MyClass.prototype.funcTwo = function(){
   console.log('funcTwo');
}
4

3 に答える 3

5

関数を動的に変更して、次のようなことを試すことができます。

var obj = MyClass.prototype;
for (var prop in obj)
    if (typeof obj[prop] == "function") // maybe also prop != "on" and similar
        (function(name, old) {
            obj[prop] = function() {
                var res = old.apply(this, arguments);
                Event.fire(name);
                return res;
            };
        })(prop, obj[prop]);
于 2013-03-25T15:15:18.027 に答える
1

常にその機能を持つ関数を構築する関数を作成できます。

var eventFunctionFactory = function(fn, e) {
  if (typeof fn != 'function' || typeof e != 'function') {
    throw new TypeError('Invalid function!');
  }

  return function(/* arguments */) {
    // Convert arguments to array
    var args = Array.prototype.slice.call(arguments);

    // Fire event
    Event.fire(e);

    // Call the function with the applied arguments
    // Return its result
    return fn.apply(fn, args);
  };
};

var myClass = function() {
  this.someFunction = eventFunctionFactory(
                        // Function
                        function(a, b) {
                          return a + b;
                        },

                        // Event
                        function() {
                          console.log('someFunction fired!');
                        }
                      );
};

var myObj = new myClass();

// Outputs:
// someFunction fired!
// 3
console.log(myObj.someFunction(1, 2));
于 2013-03-25T15:22:43.927 に答える
0

最も簡単な方法は、プロキシクラスを用意することです。通常のクラスがクラスAで、プロキシクラスがクラスBであると仮定します。クラスBには、内部にクラスAのインスタンスがあります。クラスBには、内部クラスをインスタンスと呼ぶクラスA関数ごとのスタブもあります。次に、クラスAへの関数呼び出しの前または後に、関連するスタブにコードを追加するだけで、元のクラスに必要なコードを追加できます。

拡張クラスを使用できるようにするには、アプリの残りの部分を変更して、クラスAではなくクラスBをインスタンス化するだけです。このメソッドの利点は、元のクラスがそのまま残ることです。

于 2013-03-25T15:40:36.923 に答える