Ce que l'on entend par "fonction publique ne peut pas être remplacé si un correctif est nécessaire." Dans la description d'Addy du motif du module de révélation?

Un inconvénient de ce modèle est que si une fonction privée fait référence à une fonction publique, cette fonction publique ne peut pas être remplacée si un patch est nécessaire. C'est parce que la fonction privée continuera de se référer à la mise en œuvre privée et que le modèle ne s'applique pas aux membres publics, uniquement aux fonctions.

Quelqu'un at-il un exemple de ce qu'il veut dire par là?

Lien vers le modèle du module de révélation référencé ci-dessus

Comparez un objet créé en utilisant un objet littéraire à celui créé par le modèle du module de révélation.

Voici un créé comme un objet littéral.

 function makeGreeter(name){ return { getName: function(){ return name;}, sayHello: function(){console.log("Hello, " + this.getName());} } } var greeter = makeGreeter("Danny"); greeter.sayHello; // "Hello, Danny" greeter.getName = function(){ return "George";} greeter.sayHello(); // "Hello, George" 

Lorsque vous getName méthode publique getName sur l'objet renvoyé, la méthode sayHello qui dépend de getName reprend la modification. C'est parce que dans le style Literal d'objet, les références aux fonctions publiques sont réalisées à partir de this objet renvoyé.

Cependant, lorsque vous utilisez le modèle du module de révélation,

 function makeGreeter(name){ var getName = function(){ return name;}, sayHello = function(){console.log("Hello, " + getName());}; return { getName: getName, sayHello: sayHello } } var greeter = makeGreeter("Danny"); greeter.sayHello; // "Hello, Danny" greeter.getName = function(){ return "George";} greeter.sayHello(); // "Hello, Danny" 

Le RMP greeter ne reprend pas la substitution à la méthode publique getName . C'est parce que lorsque les fonctions RMP font référence à d'autres fonctions (publiques et privées), elles se réfèrent à la copie de fermeture privée plutôt qu'à la fonction publique attachée à l'objet renvoyé.

C'est pour cette raison que je considère le modèle du module de révélation comme un anti-modèle.

Je getName à cela, ce qui, semble-t-il, indique le contenu renvoyé dans RMP.

 function makeGreeter(name){ this.getName = function(){ return name;}; var _sayHello = function(){console.log("Hello, " + this.getName());}; return { getName: getName, sayHello: _sayHello } } 

Je préfère cela, cependant:

 function makeGreeter(name){ this.getName = function(){ return name;}; var _sayHello = function(){console.log("Hello, " + this.getName());}; var API = { getName: getName, sayHello: _sayHello }; return API; }