Qual è lo scopo del prototipo?

Possibile duplicato:
Comprensione dell’eredità prototipale in JavaScript

OK, quindi sono un po ‘nuovo all’idea di OOP in JS.

Qual è la differenza tra questi due snippet di codice scritti di seguito:

function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } } 
 function animal(){ this.name = 'rover'; } animal.prototype.set_name = function(name){ this.name = name; } 

Entrambi fanno la stessa cosa, quindi qual è la differenza?

L’utilizzo del prototipo semplifica la creazione di oggetti, poiché tale funzione non deve essere ricreata ogni volta che viene creato un nuovo object.

Quando lo fai:

 function animal(){ this.name = 'rover'; this.set_name = function(name){ this.name = name; } } 

La funzione set_name viene creata de novo ogni volta che crei un animale. Ma quando lo fai

 animal.prototype.set_name = function(name){ this.name = name; } 

La funzione non deve essere ricreata ogni volta; esiste in un posto nel prototipo. Quindi quando chiamate someAnimal.set_name("Ubu"); il contesto sarà impostato su someAnimal e verrà chiamata la (e l’unica) funzione set_name .


C’è tuttavia un vantaggio nell’usare la prima syntax: le funzioni create in questo modo avranno accesso ai dati privati:

 function animal(){ var privateData = 'foo' this.name = 'rover'; this.set_name = function(name){ this.name = name; alert(privateData); //will alert 'foo' } } 

Douglas Crockford chiama le funzioni create come questo “privilegiato” per questo motivo: hanno accesso a dati sia pubblici che privati.

La differenza appare quando crei un nuovo object da questa funzione

 var animal1 = new animal(); 

Tutti gli oggetti creati dalla prima funzione avranno name diversi e proprietà set_name . Tuttavia, tutti gli oggetti creati dalla seconda funzione condivideranno la proprietà set_name .

Nel primo esempio, ogni animale separato ha una propria proprietà per la funzione set_name, mentre nel secondo esempio condividono la stessa funzione tramite il loro prototipo.

Il vantaggio della prima versione è che i metodi possono accedere a variabili locali (private) dichiarate all’interno del costruttore.

Il vantaggio del secondo metodo è che ha bisogno di meno memoria (dal momento che si memorizza il metodo una volta invece di un milione di volte) ed è più performante negli attuali motori JS.

Utilizzando il secondo metodo è inoltre ansible modificare o aggiungere metodi a una class in un modo che influisce anche su istanze già create.