propriétés des prototypes et des objets constructeurs
J'ai:
function Obj1(param)
{
this.test1 = param || 1;
}
function Obj2(param, par)
{
this.test2 = param;
}
maintenant, quand je fais:
Obj2.prototype = new Obj1(44);
var obj = new Obj2(55);
alert(obj.constructor)
J'ai:
function Obj1(param) {
this.test1 = param || 1;
}
mais la fonction constructeur a été Obj2... pourquoi?
Obj1 est devenu le Obj2 prototype...
Quelqu'un peut-il m'expliquer, en détail, la chaîne de prototype et le constructeur de la propriété
Grâce
source d'informationauteur xdevel2000
Vous devez vous connecter pour publier un commentaire.
constructor
est un régulier de propriété de l'objet prototype (avec leDontEnum
indicateur est défini de sorte qu'il n'apparaît pas dansfor..in
boucles). Si vous remplacez le prototype de l'objet, de laconstructor
propriété sera remplacé comme bien voir cette explication pour plus de détails.Vous pouvez contourner le problème en réglant manuellement
Obj2.prototype.constructor = Obj2
mais de cette façon, leDontEnum
drapeau ne sera pas réglé.En raison de ces problèmes, ce n'est pas une bonne idée de compter sur
constructor
pour la vérification du type: utilisationinstanceof
ouisPrototypeOf()
à la place.Andrey Fedorov a soulevé la question de savoir pourquoi
new
ne pas affecter laconstructor
propriété de l'instance de l'objet à la place. Je suppose que la raison pour cela est le long des lignes suivantes:Tous les objets créés à partir de la même fonction constructeur partager le constructeur de la propriété, et les propriétés partagées résider dans le prototype.
Le vrai problème, c'est que JavaScript n'a pas de prise en charge intégrée des hiérarchies d'héritage. Il existe plusieurs façons de contourner le problème (le vôtre est l'un de ceux-ci), un autre plus "dans l'esprit" de JavaScript serait le suivant:
Cela rend le multi-héritage trivial.
Découvrez Tom Trenka de la programmation orientée objet avec ECMAscript"l'Héritage" de la page. Tout du prototype est héritée, y compris la
constructor
de la propriété. Ainsi, nous avons à unbreak nous-mêmes:Version courte: ‘constructeur’ ne fait pas ce que vous en pensez, et n'est pas compatible avec tous les navigateurs. Ne jamais l'utiliser.
Version longue: Convention pour le prototype de l'héritage en JavaScript
Généralement: vous êtes confus en raison (a) de l'impédance d'incompatibilité entre une classe et d'un prototype de base OO, et (b) l'étrangeté du JavaScript particulier plutôt mauvaise interprétation de prototype à base de OO.
Vous aurez probablement à être plus heureux si vous trouvez l'une des classes-dans-les prototypes de mise en œuvre que vous aimez et s'en tenir à cela. Beaucoup de bibliothèques ont un. Voici un arbitraire celui que j'utilise:
Et voici un exemple de comment on pourrait l'utiliser:
Bien, le constructeur de la propriété est une propriété comme une autre, sur le prototype (propriété) de Obj1. Si vous comprendre comment les prototypes de travailce qui pourrait aider:
Aha! Donc, obj n'a pas de constructeur, JS va mettre sur pied de la [[Prototype]] de la chaîne, tout le chemin de Obj1.le prototype.constructeur
Je ne sais pas pourquoi le constructeur de la propriété n'est pas seulement défini sur un objet lorsque vous utilisez les "nouveaux". Il y a peut être une raison, ou c'est peut-être juste un oubli. De toute façon, j'ai tendance à l'éviter.