2012-01-17 22 views
8

Actualmente estoy leyendo 'Javascript partes buenas', y me encontré con el siguiente párrafo¿Qué es la duración del objeto en el código de JavaScript que usa la herencia del prototipo?

Si tratamos de recuperar un valor de propiedad de un objeto, y si el objeto falta el nombre de la propiedad, entonces los intentos de JavaScript para recuperar el valor de la propiedad del objeto prototipo. Y si ese objeto se carece de la propiedad, entonces se va a su prototipo, y así sucesivamente hasta el proceso por último toque fondo con Object.prototype.

Si creo un objeto obj2 de obj1 como prototipo, ¿significa que obj1 no se puede destruir hasta que obj2 también salga del alcance?

+0

que realmente no saben cómo los diferentes motores de JavaScript implementan prototipo, pero no creo que es una referencia ** ** a un objeto. Es más como un mecanismo de herencia, por lo que me sorprendería si se necesita una ** instancia ** de obj1 para que obj2 exista. –

Respuesta

5

Mientras que se ha construido la herencia de su objeto (vinculado los prototipos), no creo que el navegador se basa en sus referencias a ese objeto.

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. 

ACTUALIZACIÓN: Este comportamiento podría estar relacionado con el hecho de que en javascript no se puede destruir exactamente un objeto ; solo puedes eliminar todas las referencias a él. Después de eso, el navegador decide cómo tratar con los objetos no referenciados a través de su Garbage collector.

+1

Hm, no se 'a' sólo una referencia a ese objeto, al igual que' b.prototype' es? Parece que todavía tenemos una referencia. – kapa

+0

'b.prototype' es una ** instancia ** de' a'. (Sentir la palabra clave 'new') –

+0

Como un nombre ** **' b.prototype' es sin duda una referencia ** **, 'nuevo un()' returnes una referencia a un objeto no identificado, lo que podría ser asignado a una referencia nombrada, como 'b.prototype', o podría usarse una vez y después de haber sido usado de esa manera, se vuelve inaccesible (literalmente sale del alcance). – zuba

Cuestiones relacionadas