2012-03-09 10 views
9

mi sono imbattuto in questo post http://www.webmasterworld.com/javascript/3066162.htm su come in javascript quando si istanzia un oggetto letterale se ha metodi definiti in esso quindi ogni volta che viene istanziata anche i suoi metodi vengono copiati. quindi se hai un sacco di istanze del letterale dell'oggetto, i metodi copiati inizieranno a sommarsi in memoria.notazione letterale dell'oggetto contro prototipo di velocità e memoria

come mai lui/lei afferma che l'utilizzo del prototipo per rendere i propri metodi è più efficiente perché i metodi non vengono copiati per ogni istanza dell'oggetto del costruttore.

è vero? perché avevo l'impressione che il prototipo permettesse di aggiungere proprietà/metodi anche dopo la creazione dell'istanza dell'oggetto piuttosto che all'interno dell'oggetto al momento della sua creazione.

+2

Voglio solo notare che la creazione di un metodo dall'interno del costruttore non crea in realtà una nuova copia dell'intero metodo in memoria: un nuovo riferimento viene semplicemente apportato al metodo esistente.Tuttavia, i prototipi tendono ancora ad essere più veloci perché tutto questo è gestito dal motore JavaScript, e quindi può fare molte ottimizzazioni sulla strada, che diventano rapidamente evidenti quando istanziate decine di migliaia di oggetti. Google ha ottimizzato lo schifo della catena di prototipi del V8, che è in parte il motivo per cui è così dannatamente veloce. –

+0

@musicfreak che è bello sapere, grazie amico. – zero

risposta

10

È vero, è per questo che c'è uno prototype.

// define Function foo 
function Foo() 
{ 
    this.x = 1; 
    this.bar = 'bar'; 
} 

// define method on Foo's prototype 
Foo.prototype.helloBar = function() 
{ 
    alert(this.bar); 
} 


var foobar = new Foo(); 

foobar.helloBar(); // alerts "bar" 

Uso Foo.prototype impedisce i bit supplementari inutili associati ridefinire hellobar per ogni istanza new Foo().

+0

credo di essere confuso. è un prototipo di qualcosa a cui ogni istanza dell'oggetto fa riferimento (un po 'come chiamare una funzione) – zero

+3

@codewombat: Esatto. L'oggetto 'prototype' è condiviso tra tutti gli oggetti creati dalla stessa funzione di costruzione. Loro * si riferiscono * ad esso per accedere a proprietà che loro stessi non possiedono. –

+0

In questo caso, *** tutti gli oggetti di Function Foo ***. – xandercoded

14

Quando si crea un oggetto come questo:

function Car(c) { 
    this.color = c; 
    this.drive = function() {}; 
} 

Stai realtà la creazione di una copia della funzione di traslazione per ogni auto che si crea. In Javascript, ogni oggetto ha un puntatore prototipo e le proprietà/metodi di tale prototipo si propagano nell'albero in oggetti figlio.

Quando si esegue:

function Car(c) {this.color=c}; 
Car.prototype.drive = function {}; 

e quindi creare un paio di auto oggetti si finisce con questo, invece:

 
      {drive: function(){}} 
      /  |   \ 
     car1 (red) car2 (blue) car3 (green) 

La funzione drive è condivisa tra tutti gli oggetti Car. È un peccato che la sintassi per fare questo in Javascript sia così imbarazzante.

+0

⇈ Questa è la buona risposta. – Daniel

1

La definizione dei metodi sul prototipo di una funzione di costruzione è simile a a una definizione di classe in altre lingue. I metodi definiti in una classe Java, ad esempio, sono condivisi da tutte le istanze di quella classe. I metodi definiti sul prototipo di una funzione di costruzione, in Javascript, sono condivisi da tutte le istanze create da tale funzione di costruzione.

La differenza principale nell'esempio precedente è le dichiarazioni variabili. Una variabile definita su un prototipo verrà condivisa tra istanze dove ogni istanza di una classe avrà una propria copia delle variabili nella definizione della classe.

Il modo più semplice per capire sarebbe attraverso alcuni esperimenti. http://jsfiddle.net/3vn4A/

In Firefox è possibile accedere al proprio prototipo direttamente tramite il puntatore __proto__. Object.getPrototypeOf(obj) è il modo standard per un oggetto di fare riferimento a livello di codice al suo prototipo.

Problemi correlati