2012-01-17 9 views
8

Attualmente sto leggendo 'Javascript parti buone', e mi sono imbattuto nel seguente paragrafoQual è la durata dell'oggetto nel codice javascript che utilizza l'ereditarietà del prototipo?

Se cerchiamo di recuperare un valore di proprietà da un oggetto, e se l'oggetto manca il nome della proprietà, quindi tenta JavaScript per recuperare il valore della proprietà dall'oggetto prototype. E se quell'oggetto è privo della proprietà, allora va al suo prototipo, e così via fino al il processo finisce finalmente con Object.prototype.

Se creo un oggetto obj2 da obj1 come prototipo, vuol dire che obj1 non può essere distrutto fino a quando obj2 non va oltre lo scopo?

+0

Non so davvero come i diversi motori JavaScript implementino il prototipo, ma non penso che sia come un ** riferimento ** a un oggetto. È più simile a un meccanismo di ereditarietà, quindi sarei sorpreso se fosse necessaria una ** istanza ** di obj1 perché obj2 esista. –

risposta

5

Fintanto che hai costruito l'ereditarietà dell'oggetto (collegato i prototipi), non penso che il browser si basi sui tuoi riferimenti a quell'oggetto.

EX1:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = new a(); 
a = undefined; 
var c = new a();// error => a is not a function any more! 
b.toString();// it works because the prototype is not destroyed, 
      // only our reference is destroyed 

EX2:

var a = function(){}; 
a.prototype.toString = function(){return "I'm an A!";}; 
var b = function(){}; 
b.prototype = new a(); 
a = undefined; 
var c = new b(); 
console.log(c+'');// It still works, although our 
        // initial prototype `a` doesn't exist any more. 

UPDATE: Questo comportamento potrebbe essere legato al fatto che in javascript non si può esattamente distruggere un oggetto ; puoi solo rimuovere tutti i riferimenti ad esso. Dopodiché, il browser decide come gestire gli oggetti senza riferimento tramite il suo numero Garbage collector.

+1

Hm, non era 'a' solo un riferimento a quell'oggetto, proprio come' b.prototype' è? Sembra che abbiamo ancora un riferimento. – kapa

+0

'b.prototype' è una ** istanza ** di' a'. (senti la parola chiave 'new') –

+0

Come un ** nome **' b.prototype' è certamente un ** riferimento **, 'nuovo a()' restituisce un riferimento senza nome a un oggetto, che potrebbe essere assegnato ad un riferimento denominato, come 'b.prototype', o potrebbe essere usato una volta e dopo essere stato usato in quel modo diventa inaccessibile (letteralmente va fuori dal campo di applicazione). – zuba

Problemi correlati