2011-08-23 14 views
9

Normalmente nel mio progetto creo la mia classe in questo modo ... Oggetto letterale.JavaScript Prototipo esplicativo necessario

var objectName = { 

    //global variables 
     a : 'somevalue', 

     func1: function(){ 

     }, 


     func2: function(){ 

     } 

} 

Se devo trasformare questo in formato prototipo, come dovrei farlo?

Quale sarebbe il mio vantaggio di utilizzare il prototipo rispetto a questo, quando il lavoro viene svolto con questo formato.

Perché la gente parla così tanto sul prototipo.

risposta

32

trasformata in un prototipo sarebbe simile:

var someObject = function() { 
    this.a = "somevalue"; 
}; 

someObject.prototype.func1 = function() { // work }; 
someObject.prototype.func2 = function() { // work }; 

var myObject = new someObject(); 

Quali sono alcuni dei vantaggi? Bene, ci sono un sacco, ma ci sono motivi davvero pratici quando i prototipi rendono più sensato rispetto ai letterali degli oggetti.

Il primo è la riduzione del codice duplicato; Quindi, diciamo che si desiderava un altro oggetto molto intuitivo a objectName, ma si voleva a a essere un valore diverso. Si sarebbe probabilmente finire con qualcosa di simile:

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

E si potrebbe ridurre le funzioni duplicate dicendo

var objectName = { 
     a : 'somevalue', 
     func1: function(){ }, 
     func2: function(){ } 
} 

var otherObjectName = { 
     a : 'otherValue', 
     func1: objectName.func1, 
     func2: objectName.func2 
} 

Oppure, usando un prototipo, ho potuto solo fare in modo ho potuto passare il valore Voglio per a durante la costruzione dell'oggetto. Il codice refactored sarebbe simile a questo:

var someObject = function(a) { 
    this.a = a; 
}; 

someObject.prototype.func1 = function() { /* work */ }; 
someObject.prototype.func2 = function() { /* work */ }; 

var myObject = new someObject("somevalue"); 
var myOtherObject = new someObject("otherValue"); 

Ora, se volessi aggiungere una nuova funzione a entrambi. Usando l'apporach letterale dell'oggetto, dovresti ricordarti di aggiungerlo anche ad otherObjectName. Man mano che il numero dei tuoi letterali aumentava, sarebbe stato più lungo e più difficile gestirli tutti.

Utilizzando l'approccio prototipo, tutto ci sarebbe da dire è:

someObject.prototype.func3 = function() { // do even more work } 

o anche più interessante potrei estendere dinamicamente sia oggetto da solo avere un riferimento a uno dicendo.

// find what function made me, get its prototype, and add a new function to it 
myObject.constructor.prototype.func3 = function() { /* work */ } 
myOtherObject.func3() // tada magic! 

o potrei fare un nuovo oggetto, da solo conoscendo un riferimento. come:

var newObject = myObject.constructor(myObject.a + " new"); 

Poiché sia ​​myObject e myOtherObject condividono la stessa constructor e prototype, ci sono un sacco di cose interessanti si possono fare con quel rapporto che non si può fare con letterali oggetto.

Puoi pensare ai prototipi come piccole fabbriche per creare oggetti invece di dover creare ogni oggetto da solo come letterale.

Ora, se stai pensando, "Beh, ho solo uno di questi e non ho intenzione di fare nessuno dei tuoi pazzi metodi estendendo la magia."Definire un oggetto letterale è un appunto perfettamente valido per alcuni problemi.A volte l'utilizzo di un prototipo è migliore.Utilizzare lo schema che ha senso per il problema che si sta tentando di risolvere, invece di provare ad adattare il problema in un

+0

spiegazione molto bella ... grazie – Anshul

+0

non capisco :( –

+0

quindi qual è la differenza o il vantaggio nella definizione della funzione nella funzione di costruzione e tra la definizione in prototipo come: constructor.prototype.func = function () {}; –

Problemi correlati