2015-07-06 2 views
1

Эй, ребята я просто пытаюсь понять ВЫЯВЛЕНИЕ МОДУЛЬНЫЕ КАРТИНЫ, я вижу следующее простое изображение в откровенном модульной схеме:понимание показывая модульный шаблон

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

Проблема заключается в том, что inc использует var 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 ссылаюсь на свой 1-й пример почему 'значение()' 'внутри вкл()' все еще обратитесь к старому 'value()', даже если функция 'value()' была переопределена. –

+1

@AlexanderSolonik: добавлено объяснение. – georg

Смежные вопросы