2013-05-31 163 views
6

我有以下模式JS模塊模式覆蓋功能

BASE = function() { 
    var that = {}; 
    var number = 10; 

    that.showNumber = function(){ 
     that.alertNumber(); 
    } 

    that.alertNumber = function() { 
     alert(number); 
    };  
    return that; 
}; 

CHILD = function() { 
    var that = Object.create(BASE()); 
    var secondNumber = 20; 

    // Override base function 
    that.alertNumber = function() { 
     alert(secondNumber); 
    }; 
    return that; 
}; 

var ch = CHILD(); 
ch.showNumber(); 

你能告訴我怎樣才能調整由Douglas Crockford的啓發,完全覆蓋alerNumber功能我的模塊格局?到目前爲止showNumber功能顯示的10而不是20

謝謝大家先進

的jsfiddle與代碼here

+0

爲什麼不簡單地使用原型?這會使它變得簡單。 –

+0

爲什麼不寫var = new BASE(); ? – frenchie

+0

這種模式允許多重繼承 –

回答

5

你可以改變

that.showNumber = function(){ 
    that.alertNumber(); 
} 

that.showNumber = function(){ 
    this.alertNumber(); 
} 

但我不確定我看到了什麼Ÿ你不要簡單地使用the prototype-base inheritance model

+0

這是我不完全理解的事情。爲什麼在'base'中this.alertNumber()'被引用到'Base'類中的'that'? –

+0

您使用的這種模式在閉包中設置了一個'that'變量,以確保showNumber函數使用構造函數中定義的實例,從而使大多數高級繼承方案不起作用(例如,調用另一個函數的超類函數並讓它成爲覆蓋)。 –

+0

好吧,如果我把它弄好,當我想要重寫父函數時,我必須使用不同的模式?我很抱歉有這樣一個沒有問題的問題,但我只有在繼承完全不同的Java的經驗。 –