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; }