2013-07-07 30 views
7

Supponiamo che io a creare una fabbrica di oggetto in questo modo:l'efficienza dello storage funzione anonima

var newObj=function(x){ 
    var obj=[] 
    obj.x=x 
    obj.add=function(n){ 
    return this.x+n 
    } 
    return obj 
} 

Ora supponiamo che io creo centinaia di istanze di questo oggetto:

var obj1=newObj(1) 
var obj2=newObj(2) 
... 

Does ogni obj1, obj2, .. archiviare la propria copia di obj.add o contengono tutti un riferimento a una singola istanza di obj.add archiviata in memoria?

Grazie!

+0

Sto creando un'applicazione nodo con un numero molto grande di oggetti molto grandi utilizzando la tecnica di fabbrica mostrata sopra. Mi è venuto in mente che probabilmente sto sprecando un sacco di spazio di archiviazione. Sembra che dovrei iniziare a riempire la proprietà del prototipo. – gloo

+0

Avresti potuto scoprire facilmente confrontando 'obj1.add === obj2.add'. –

+0

Vedere http://stackoverflow.com/questions/17308446/how-big-are-javascript-function-objects – user123444555621

risposta

2

Entrambe obj e obj2 eseguiranno l'istante delle proprie copie di obj.add. Sono espressioni di funzioni che vengono eseguite alla creazione e archiviate nella memoria per la durata della vita dell'oggetto.

Se si desidera mantenere le prestazioni, ciò che si dovrebbe usare è prototyping:

var newObj=function(x){ 
    this.obj = []; 
    this.obj.x = x; 
    return this.obj; 
} 

newObj.prototype.add = function(n) { 
    return this.obj.x += n; 
} 

Questo creerà una funzione che tutti i futuri newObj oggetti utilizzeranno senza occupare spazio in memoria per esattamente la stessa funzione.

+2

Il punto di utilizzo dei prototipi è perso se si dichiara il metodo _both_ sul prototipo e nella funzione come prima, come quest'ultimo sostituirà la definizione del prototipo – altschuler

+0

Grazie per tale cattura; Ho aggiornato la mia risposta per non essere così sciocca. –

+0

Grazie. Perché la prototipia funzioni, devo usare la "nuova" tecnica delle parole chiave come nel "nuovo Obj" o funziona con la mia fabbrica "newObj"? – gloo

1

Avranno tutti le proprie istanze di tale metodo.

Se si utilizza prototypes, condivideranno tale metodo, dato che lo si dichiara su l'oggetto prototipo.

Così si potrebbe fare qualcosa di simile

newObj.prototype.add = function(n) { 
    return this.x+n 
} 

E poi non dichiarare add sull'oggetto come prima.

In V8 c'è una cosa che si chiama hidden classes che in pratica significa che tutte le istanze newObj condivideranno una classe nascosta finché non si fanno modifiche a un esempio, che sarebbe (per quanto ho capito) in modo efficace fare la newObj condivide il metodo come con la prototipazione.

Problemi correlati