2012-01-31 13 views
21

recientemente he empezado a leer sobre programación orientada a objetos JavaScript y una cosa que los autores parecen pasar por alto es cuando un objeto A ha sido declarado y de repente veo "A.prototype.constructor = A; Por ejemplo,¿Por qué usar object.prototype.constructor en OOP javascript?

var A = function(){}; // This is the constructor of "A" 
A.prototype.constructor = A; 
A.prototype.value = 1; 
A.prototype.test = function() { alert(this.value); } 
var a = new A(); // create an instance of A 
alert(a.value); // => 1 

Así que ejecute el comando en firebug "var a = function() {};". y luego "A.Constructor" que revela que es una función que entienden esto
funciono con el código "A.prototype.. constructor = A; "y pensé que esto cambia el constructor A de Function a A.

La propiedad del constructor de A ha sido chan Ged ¿verdad? En cambio, cuando ejecuto "A.constructor", me da la función() todavía.

¿Cuál es el punto?

También veo A.constructor.prototype.constructor.prototype .. ¿qué está pasando?

+6

Qué autores, ¿dónde? –

+0

El código que obtuve de esto es http://www.ruzee.com/blog/2008/12/javascript-inheritance-via-prototypes-and-closures – Matt

Respuesta

12

Si A hereda B usando A.prototype = new B();, es necesario restablecer la propiedad constructor de la clase A usando A.prototype.constructor=A;, de lo contrario las instancias de un tendrían un constructor de B.

En su caso, A.prototype.constructor === A volverá cierto, por lo A.prototype.constructor = A no hizo nada.

+0

Interesante por lo que A.prototype.constructor = A; haría que A se aislara de B? De esta forma, puede extender más propiedades usando A.prototype sin agregar más propiedades a B? – Matt

+0

No se trata de aislar, solo se asegura de que A tenga la propiedad de constructor correcta. – xdazz

+11

¿Cuál es el propósito de tener la propiedad de constructor correcta? ¿Cuándo se ha consultado realmente A.prototype.constructor en la práctica? No parece afectar el comportamiento de crear nuevas instancias de A, afaics. La respuesta debe ser tan obvia que generalmente no se expresa, y por eso me ha eludido :-) – Yetanotherjosh

4

Puede probar rápidamente que esa asignación adicional no hace absolutamente nada:

var A = function() {}; 
A.prototype.constructor === A; // true -- why assign then? 

Restablecimiento de la propiedad constructor sólo tiene sentido si ha asignado un nuevo objeto prototipo de la clase, el constructor sobrescribir el original:

var A = function() {}; 
A.prototype = protoObject; // some object with members that you'd like to inherit 
A.prototype.constructor = A; // reset constructor 

En su caso, el autor podría estar haciendo ciegamente esto como una buena práctica, incluso en los casos en que no sea necesario.

2

Este código si utiliza a menudo en un patrón de herencia clásica JS (el código es de Patrones de JavaScript por Stoyan Stefanov):

function inherit(C, P) { 
    var F = function() {}; 
    F.prototype = P.prototype; 
    C.prototype = new F(); 
    C.uber = P.prototype; 
    C.prototype.constructor = C; 
} 

para asignar el constructor derecho de la clase hija.

En su caso, no hizo nada, ya que A.prototype.constructor === A antes de la asignación.

1

Es posible que desee ver mi respuesta a la pregunta similar:

https://stackoverflow.com/a/19616652/207661

TL; DR: el constructor no es una propiedad de una instancia. Para que todo se vea coherente, el intérprete de JavaScript necesita configurar prototype.constructor para funcionar. Esta característica se puede usar en funciones que operan genéricamente en muchos tipos diferentes de objetos.

1

Según MDN, todos los objetos heredan una propiedad constructor de su prototipo:

Example 1: 
var o = {}; 
o.constructor === Object; // true 

..

Example2: 
function Tree() { 
}  
var theTree = new Tree(); 
console.log(theTree.constructor === Tree); // true 

En tiempo de ejecución, no hace ninguna diferencia en función del valor de la propiedad del constructor.

Sin embargo, como la propiedad del constructor devuelve una referencia a la función Object que creó el prototipo de la instancia, se debe restablecer la propiedad del constructor cuando asigne un nuevo prototipo a la función Object.

var Forest = function() {}; 
Forest.prototype = theTree; 
console.log(new Forest().constructor === Tree); // true 
Forest.prototype.constructor = Forest; 
console.log(new Forest().constructor === Forest); // true 

https://jsfiddle.net/j1ub9sap/

Para más detalles: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor

+0

Hola, salto en su comentario unos meses más tarde porque no entiendo esta oración: "Sin embargo, como la propiedad del constructor devuelve una referencia a la función Object que creó el prototipo de la instancia " La función Objeto no crea el prototipo de la instancia, crea la instancia directamente ¿no? Qué significa exactamente ? Gracias – jobou

+0

Significa que si Forest hereda el Árbol usando Forest.prototype = new theTree(), las instancias de Forest tendrán un constructor de theTree. Para tener Forest como constructor, es necesario restablecer la propiedad del constructor para Forest utilizando Forest.prototype.constructor = Forest. –

+0

Entiendo tu ejemplo. Mi pregunta era más sobre la documentación oficial: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor Dice "Devuelve una referencia a la función Object que creó la instancia prototipo.". Sin embargo, todos los ejemplos en esta página no tienen su prototipo anulado. No hay herencia personalizada: 'var a = []; a.constructor === Array; 'Entonces, ¿por qué no dice que" el constructor es la referencia a la función Object que creó la instancia en sí misma "? Gracias – jobou