2013-03-11 28 views
0

什麼是擴展函數的最佳方式,以便在調用函數時調用新的擴展類。將JavaScript對象同時擴展爲初始化

採取以下類:

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()時,我們希望擴展類自動調用。我們的目標是擴展這個類,就像綁定一個點擊事件到一個鏈接,但不用修改原始函數中的任何東西。

+0

爲什麼該對象被稱爲「類」? 「擴展班」是什麼意思? – Bergi 2013-03-11 20:03:58

+0

只是爲了這個例子,我用過「班級」。 – 2013-03-11 20:06:46

回答

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)); 
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); 
    }; 
}()); 
0

一個更通用的extend方法,可以延長任何方法不只是初始化:

Live at 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();