2012-07-26 13 views
5

El siguiente código es casi idéntico a algún código del excelente libro de Douglas Crockford, JavaScript: The Good Parts, de las páginas 29-30. La única diferencia es que, añade la propiedad get_status así:Código de Crockford relativo al Patrón de Invocación de Constructor

Quo.prototype.get_status=function() { 
    this.status=string; 
} 

Mi pregunta es por eso que su código se ejecuta bien, pero mi pequeño cambio, a continuación, se traduce en un error que dice myQuo no tiene un método get_status?

<script> 
    var Quo=function(string) { 
    this.status=string; 
    } 
    Quo.get_status=function() { 
    return this.status; 
    } 
    var myQuo=new Quo("confused"); 
    alert(myQuo.get_status()); 
</script> 

Respuesta

8

va a añadir el método al objeto Quo función, no a su prototipo, por lo que no será heredado por las instancias creadas con new Quo(). Una función agregada de esta manera es un poco como un método estático en los lenguajes OOP clásicos: se puede llamar con Quo.get_status(), pero no será heredado por instancias y this se referirá a la función Quo.

Quo.status = "foo"; 
Quo.get_status(); // "foo" 
+1

La pregunta es _why_ get_status no se ha agregado a myQuo. Ya sé que lo agregué a Quo, no a su prototipo. –

+5

Las instancias no heredan propiedades o métodos de sus constructores; solo las propiedades y los métodos asociados al prototipo se heredan. – nrabinowitz

0

Las funciones son objetos en JavaScript. Cuando agrega propiedades a funciones, las instancias de esa función no las heredan. Sin embargo, cuando agrega propiedades al prototipo de la función, se heredan. Para comprender cómo funciona la herencia basada en prototipos en JavaScript, lea following answer.

Cuestiones relacionadas