constructor
es una característica regular del objeto prototipo (con la DontEnum
bandera establecida para que no aparezca en for..in
bucles). Si reemplaza el objeto prototipo, también se reemplazará la propiedad constructor
; consulte this explanation para obtener más detalles.
Puede solucionar el problema configurando manualmente Obj2.prototype.constructor = Obj2
, pero de esta forma, la bandera DontEnum
no se configurará.
Debido a estos problemas, no es una buena idea confiar en constructor
para comprobar el tipo: use instanceof
o isPrototypeOf()
en su lugar.
Andrey Fedorov planteó la pregunta de por qué new
él no se asigna la propiedad constructor
al objeto de instancia en su lugar. Supongo que la razón para esto está en las siguientes líneas:
Todos los objetos creados a partir de la misma función de constructor comparten la propiedad del constructor, y las propiedades compartidas residen en el prototipo.
El problema real es que JavaScript no tiene soporte integrado para las jerarquías de herencia. Hay varias maneras de evitar el problema (el suyo es uno de ellos), otro más 'en el espíritu' de JavaScript sería el siguiente:
function addOwnProperties(obj /*, ...*/) {
for(var i = 1; i < arguments.length; ++i) {
var current = arguments[i];
for(var prop in current) {
if(current.hasOwnProperty(prop))
obj[prop] = current[prop];
}
}
}
function Obj1(arg1) {
this.prop1 = arg1 || 1;
}
Obj1.prototype.method1 = function() {};
function Obj2(arg1, arg2) {
Obj1.call(this, arg1);
this.test2 = arg2 || 2;
}
addOwnProperties(Obj2.prototype, Obj1.prototype);
Obj2.prototype.method2 = function() {};
Esto hace herencia múltiple trivial también.
'constructor' es una propiedad que es compartida entre todas las instancias objetos creados a partir del mismo constructor, por lo tanto, es lo correcto para ponerlo en el prototipo; Es solo que JS no tiene soporte integrado para las jerarquías de herencia (profundas). Agregaré una explicación a mi respuesta ... – Christoph