2012-01-19 7 views
5

Quando si utilizza il modello di modulo in JavaScript come dovrebbero essere definiti costruttori, se non del tutto. Vorrei che il mio costruttore si inserisse in un modello di modulo standard e non fosse globale.Costruttori nel modello modulo

Perché non qualcosa di simile a questo lavoro, è una sciocchezza completa e totale?

+0

'self.name' è una stringa' "john" 'quindi non si può invocarlo. Si noti che la funzione locale 'nome' non viene esportata da nessuna parte. – Raynos

+0

La domanda aggiornata, ma ha fatto una risposta perfettamente valida, non ha senso, quindi è tornata indietro. – zode64

risposta

1

È necessario portare il metodo e collegarlo al prototipo Person. Ma quando lo fate, avrete una proprietà nome, e un metodo nome, che non funziona, in modo da considerare la ridenominazione quest'ultimo

HOUSE.Person.prototype.getName = function(){ 
    return this.name; 
} 

O, si può solo attaccarlo al this, e fare un getName metodo privilegiato:

Person: function() { 
     this.name = "john"; 
     this.getName = function() { 
      return this.name; 
     } 
    } 
+0

Penso che ci sia un piccolo problema di sintassi. :) – pimvdb

+0

Quindi assegnare 'var auto = this' quindi non è necessario cambiare questo non? – zode64

+0

Anche questo è considerato una buona pratica? – zode64

2

Uso var e function foo() {} (quest'ultimo come una dichiarazione, che significa "solo" function foo() {} senza assegnarlo), crea simboli locali. Quindi, la funzione non è disponibile al di fuori del costruttore.

Qualunque cosa si desidera esporre (rendere pubblico), è necessario assegnare a this (o self dato definito self = this):

self.getName = function() { 
    return self.name; 
}; 

Si noti che è già stato utilizzato name, così ho dato funzione di un altro nome. Se si voleva fare la stringa name locali, ed esporre la funzione, poi si può avere lo stesso nome dal momento che non c'è conflitto. Es .:

var name = "john"; 

self.name = function() { 
    return name; 
}; 
3

Il tuo codice è quasi valido. Tuttavia la funzione name() non era pubblica ma la variabile era così che stavi cercando di eseguire la variabile causando un errore. Aggiungere la funzione getName sull'oggetto e chiamare che invece:

var HOUSE = function() { 
    return { 
     Person: function() { 
      var self = this; 
      self.name = "john"; 
      self.getName = function() { 
       return self.name; 
      } 
     } 
    }; 
}(); 

var me = new HOUSE.Person(); 
alert(me.getName()); 

http://jsfiddle.net/8nSbP/

+1

È questo il pensiero di come buona pratica? – zode64