Come gestire le funzioni locali all'interno del modello di moduli rivelatori che "restituiscono questo"

StackOverflow https://stackoverflow.com//questions/12691636

Domanda

Mi piace il modello di moduli rivelatori.Avrò funzioni private che vorrei rendere pubblico e restituirle.Ma potrei anche avere alcune funzioni locali all'interno del mio modello di moduli rivelatori che "restituiscono questo" ...

var player = function(){
//my local variable scope...

oplayer.damage = function(){
    if(!this.grace){
        this.shield--;
        if (this.shield == 0){
            return this;
        }
    }
};
      ...

      return {
      damage : oplayer.damage
      }
      }();
.

Va bene "restituire questo" se sto restituendo esplicitamente qualcosa?(nel contesto per utilizzare il modello di moduli rivelatori).In caso contrario, come posso trasformare la mia funzione locale oplayer.Damage da utilizzare in un contesto corretto?Grazie per qualsiasi consiglio!Sto solo cercando di avvolgere la mia mente in tutto il concetto di "restituisce questo".

È stato utile?

Soluzione

Dovrebbe andare bene, perché "questo" è contestuale all'esecuzione.Perché stai restituendo questo su una funzione pubblica che fa parte dell'oggetto "abbattuto", quindi avrai solo l'oggetto tagliato.Quindi, penso che cosa stai cercando di fare dovrebbe andare bene se consideri i seguenti scenari:

var test = function(){
   var pri = function(){
       console.log("Private");
   };

   var pub = function(){
       pri();
       console.log("pub");
       return this;
   }

   return {
       pub: pub
   };
}();

console.log(test.pri); //-> undefined
console.log(test.pub); //-> function(){…}
console.log(test.pub()); //-> "Private" "pub" [Object {…}]
console.log(test.pub().pri); //-> "Private" "pub" undefined
.

Altri suggerimenti

Si prega di verificare prima cosa è la parola chiave this, c'è un Buona introduzione su MDN .

.

Va bene "restituire questo" se sto rendo esplicitamente qualcosa?

Sì, ovviamente. Questo è il modello predefinito per il chalabilità dei metodi - tutto restituisce l'oggetto che è stato chiamato. Tuttavia, per fare affidamento su che avresti bisogno di restituirlo in ogni caso, non solo quando gli scudi sono giù.

Se questo non era il tuo obiettivo, usa solo un'istruzione return; normale (risultati in undefined come nessuna istruzione di ritorno).

.

nel contesto per utilizzare il modello di moduli rivelatori

Non importa assolutamente dove hai definito quella funzione.

.

Trasforma la mia funzione da utilizzare in un contesto corretto?

(Assumono con " context " Si fa riferimento all'oggetto this qui)

Non è possibile davvero, il valore di this dipende sempre dall'invocazione della funzione. Naturalmente, è possibile che .bind() La funzione a Il tuo oggetto player o semplicemente restituire direttamente solo player anziché this.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top