2015-07-06 149 views
1

嘿,大家好我只是想了解揭示模塊化PATTERN,我看到揭示模塊化模式的以下簡單描述:理解揭示模塊化模式

var myRevealingModule = (function() { 

     var privateCounter = 0; 

     function privateFunction() { 
      privateCounter++; 
     } 

     function publicFunction() { 
      publicIncrement(); 
     } 

     function publicIncrement() { 
      privateFunction(); 
     } 

     function publicGetCount(){ 
      return privateCounter; 
     } 

     // Reveal public pointers to 
     // private functions and properties 

     return { 
      start: publicFunction, 
      increment: publicIncrement, 
      count: publicGetCount 
     }; 

    })(); 

myRevealingModule.start(); 

現在以下缺點陳述的揭示moduar模式::

這種模式的缺點是,如果一個私有函數是指 公共職能,公共功能無法確認修補程序覆蓋是必要的。這是因爲私有函數將繼續以 引用私有實現,並且該模式不適用於 公共成員,僅適用於函數。

我不太明白上面這段話的意思,有人能解釋一下嗎?私人功能是指公共功能,沒有完全得到,有人可以分解它嗎?

回答

2

考慮:

Mod = function() { 
 
    
 
    
 
    function inc() { 
 
    return value() + 1; 
 
    } 
 
    
 
    var value = function() { return 42 } 
 
    
 
    var valuePlusOne = function() { return inc() } 
 
    
 
    return { 
 
    value: value, 
 
    valuePlusOne: valuePlusOne 
 
    } 
 
}() 
 

 
document.write(Mod.valuePlusOne()) // 43 
 

 
Mod.value = function() { 
 
    return 999 
 
} 
 

 
document.write(Mod.valuePlusOne()) // still 43, not 1000

的問題是,使用incvar value從包含它的範圍,而不是模塊對象的value屬性。當您更換模塊時,這不會影響示波器的var value

一種解決方法是私有函數綁定到對象返回:

Mod = function() { 
 
    
 
    var value = function() { return 42 } 
 
    
 
    var valuePlusOne = function() { return inc() } 
 
    
 
    var me = { 
 
    value: value, 
 
    valuePlusOne: valuePlusOne 
 
    } 
 
    
 
    function inc() { 
 
    return me.value() + 1; 
 
    } 
 
    
 
    
 
    return me; 
 
}() 
 

 
document.write(Mod.valuePlusOne()) // 43 
 

 
Mod.value = function() { 
 
    return 999 
 
} 
 

 
document.write(Mod.valuePlusOne()) // 1000

+0

@george關於你第一個例子,爲什麼不'值()''裏面INC()'仍然儘管'value()'函數已被覆蓋,但仍參考舊的'value()'。 –

+1

@AlexanderSolonik:增加了一個解釋。 – georg