constructor
est une propriété régulière de l'objet prototype (avec DontEnum
drapeau défini pour ne pas apparaître dans for..in
boucles). Si vous remplacez l'objet prototype, la propriété constructor
sera également remplacée - voir this explanation pour plus de détails.
Vous pouvez contourner le problème en définissant manuellement Obj2.prototype.constructor = Obj2
, mais de cette façon, le drapeau DontEnum
ne sera pas défini. En raison de ces problèmes, il n'est pas une bonne idée de s'appuyer sur constructor
pour la vérification de type: utilisez instanceof
ou isPrototypeOf()
à la place.
Andrey Fedorov a soulevé la question de savoir pourquoi new
n'attribue pas la propriété constructor
à l'objet par exemple au lieu. Je suppose que la raison de ceci est le long des lignes suivantes:
Tous les objets créés à partir de la même fonction de constructeur partagent la propriété constructeur, et les propriétés partagées résident dans le prototype.
Le vrai problème est que JavaScript n'a pas de prise en charge intégrée des hiérarchies d'héritage. Il y a plusieurs façons de contourner la question (le vôtre est l'un d'entre eux), un autre plus « dans l'esprit » de JavaScript serait la suivante:
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() {};
Cela rend trivial l'héritage multiple aussi bien.
'constructor' est une propriété qui est partagée entre toutes les instances des objets créés à partir du même constructeur, par conséquent, c'est la bonne chose à mettre dans le prototype; c'est juste que JS n'a pas de support intégré pour les hiérarchies d'héritage (profondes) - j'ajouterai une explication à ma réponse ... – Christoph