2011-02-09 9 views
16

En la herencia de JavaScript Prototype, ¿cuál es el objetivo de agregar propiedad prototype.constructor. Dejame explicarte con un ejemplo.Ventajas de establecer la propiedad "constructor" en el "prototipo"

 
var Super = function() { 
    this.superProperty = 'Super Property' 
} 
var Sub = function() { 
    this.subProperty = 'Sub Property' 
} 

Sub.prototype = new Super(); 
Sub.prototype.constructor = Sub; // advantages of the statement 

var inst = new Sub(); 

Las siguientes líneas producen siempre es cierto en todos los casos, cuando se añade Sub.prototype.constructor = Sub o no.

 
console.log(inst instanceof Sub) // true 
console.log(inst instanceof Super) // true 

Supongo que puede ser útil al obtener nuevas instancias, pero ¿cuándo y/o cómo?

Gracias de antemano.

+2

gran pregunta! – tybro0103

Respuesta

10

Es solo para restablecer correctamente la propiedad constructor para reflejar con precisión la función utilizada para construir el objeto.

Sub.prototype = new Super(); 

console.log(new Sub().constructor == Sub); 
// -> 'false' 

Sub.prototype.constructor = Sub; 
console.log(new Sub().constructor == Sub); 
// -> 'true' 
+2

¿Cuál es exactamente la consecuencia de no configurarlo? O, en otras palabras, ¿cuándo importa realmente el valor de Sub.prototype.constructor? No parece afectar la creación de instancias de Sub en absoluto, afaics. Esta debe ser una de esas cosas "tan obvias" que nadie realmente lo dice abiertamente, y por lo tanto me ha eludido :-) – Yetanotherjosh

+6

@Yetanotherjosh: bueno, en el caso del código de OP, si deja esa línea, luego 'inst.constructor === Super', a pesar de que se creó una instancia con' new Sub() '. Por lo general, esto no sería un problema si a usted no le importa esa propiedad, pero si compartiera la instancia con otro código, entonces podría causar confusión en algunos casos, incluyendo donde 'new inst.constructor()' resultaría en realidad en una instancia de 'Super()' y no 'Sub()' (por lo que faltarían propiedades exclusivas de 'Sub.prototype'). ** tl; dr es una buena práctica de programación **. –

Cuestiones relacionadas