0

関数を拡張して、呼び出されたときに新しい拡張クラスも呼び出されるようにするための最良の方法は何ですか。

次のクラスを受講してください。

var class = {}

class.init = function(){
 //do something
};

たとえば、initを拡張します。

class.init.prototype.extend = function(){
 console.log("hey look at me, I get called too!");
}

ここでの考え方は、class.init()が呼び出されたときに、拡張クラスも自動的に呼び出されるようにすることです。目標は、クラスを拡張して、クリックイベントをリンクにバインドするのと同じように、元の関数から何も変更せずに拡張することです。

4

3 に答える 3

2

関数を、上書きされた関数も呼び出す関数で上書きできます。

(function (old) {
    class.init = function() {
        console.log("hey look at me, I get called before!");
        var result = old.apply(this, arguments);
        console.log("hey look at me, I get called after!");
        return result;
    };
}(class.init));
于 2013-03-11T20:05:30.467 に答える
1

class.init元の関数と新しい関数を呼び出すプロキシ関数に再割り当てできます。

このようなもの:

var class = {}

class.init = function(){
 //do something
};

(function(){
    var _old = class.init;
    class.init = function(){
        console.log("hey look at me, I get called too!");
        return _old.apply(this, arguments);
    };
}());
于 2013-03-11T20:04:22.567 に答える
0

extendinitだけでなく、任意のメソッドを拡張できる、より一般的なメソッド:

JSBinに住む

function Klass(name){
  this.name = name;
  this.staticMethod = function(){console.log('static method at Klass');};
}

Klass.prototype.someMethod = function(){console.log('Klass.someMethod');};

Klass.extend = function(extention){
  function extendMethod(method1, method2){
    var args = arguments;
    var contex = this;
    return function(){
      method1.apply(contex, args);
      method2.apply(contex, args);
    };
  }

  var proto = new Klass();
  var Extended = function(){Klass.apply(this, arguments);};
  for(var key in extention){
    if(typeof proto[key] === 'function' && typeof extention[key] === 'function'){
      var oldMethod = proto[key];
      proto[key] = extendMethod(oldMethod, extention[key]);
    }
  }
  Extended.prototype = proto;
  return Extended;
};




var ExKlass = Klass.extend({
  someMethod: function(){
    console.log('ExKlass.someMethod');
  }
});


var k = new Klass();
var ek = new ExKlass();

k.someMethod();
ek.someMethod();
于 2013-03-11T20:42:02.837 に答える