Qu'elle est la signification de l'Javascript constructeur de propriété?
Tenter de plier en tête autour de Javascript sur OO...et, comme beaucoup d'autres, en cours d'exécution dans la confusion au sujet de la constructor
de la propriété. En particulier, l'importance de la constructor
bien, comme je ne peux pas me faire avoir aucun effet. E. g.:
function Foo(age) {
this.age = age;
}
function Bar() {
Foo.call(this, 42);
this.name = "baz";
}
Bar.prototype = Object.create(Foo.prototype);
var b = new Bar;
alert(b.constructor); //"Foo". That's OK because we inherit `Foo`'s prototype.
alert(b.name); //"baz". Shows that Bar() was called as constructor.
alert(b.age); //"42", inherited from `Foo`.
Dans l'exemple ci-dessus, l'objet b
semble avoir eu le droit constructeur appelé (Bar
) – et il hérite de la propriété age de Foo
. Alors pourquoi beaucoup de gens suggèrent cela comme une étape nécessaire:
Bar.prototype.constructor = Bar;
Clairement, le droit Bar
constructeur était appelé lors de la construction de b
, donc quel est l'impact de ce prototype de biens? Je suis curieux de savoir quelle différence cela fait vraiment avoir la propriété constructor set 'correctement'—que je ne le vois pas avoir une incidence sur quel constructeur est en fait appelé après qu'un objet est créé.
OriginalL'auteur aaa90210 | 2010-10-25
Vous devez vous connecter pour publier un commentaire.
La
constructor
de propriété ne fait absolument aucune différence pratique à quoi que ce soit à l'interne. C'est seulement utile si votre code utilise explicitement. Par exemple, vous pourriez décider de chacun de vos objets ont une référence à la réalité de la fonction constructeur qui l'a créé; si oui, vous aurez besoin de définir lesconstructor
bien explicitement lorsque vous configurez l'héritage par l'affectation d'un objet à une fonction constructeur de laprototype
bien, comme dans votre exemple.constructor
est une partie importante d'être en mesure de caleObject.getPrototypeOf
. Personnellement, j'utiliseObject.getPrototypeOf
et suppose que tout le monde ne veut pas briser leprototype
<->constructor
relationPas l'hypothèse la plus sûre, mais probablement plus sûr que c'est utilisé pour être. Revenir quelques années et presque tous l'objet JavaScript héritage des tutoriels sur le site web de Java d'influence et recommandé de régler manuellement la
constructor
de la propriété. Vous et moi sommes très différents ethoses: je préfère de beaucoup de wrappers pour des cales, et ont vécu sansObject.getPrototypeOf
depuis si longtemps que je n'ai pas de désir brûlant pour elle maintenant.Le point principal est que nous devons avertir les gens que pour ES5 la conformité de cette relation ne doit pas être rompu dans les navigateurs plus anciens
Je pense que je voudrais examiner s'appuyant sur la
constructor
de la propriété, qui, comme discuté a une histoire d'être touché dans les scripts et est par ailleurs d'aucune utilité, une exigence inacceptable pour n'importe quel cale et ne recommandent pas l'utilisation de l'informatique en général.On devrait avoir ces discussions dans le chat, mais c'est un timesuck.
OriginalL'auteur Tim Down
La première étape est de comprendre ce que
constructor
etprototype
sont tout au sujet. Il n'est pas difficile, mais on doit se laisser aller, de "l'héritage" dans le sens classique du terme.Le constructeur
La
constructor
propriété ne pas cause tout particulier d'effets dans votre programme, sauf que vous pouvez regarder pour voir lequel la fonction a été utilisé en conjonction avec l'opérateurnew
créer votre objet. Si vous avez tapénew Bar()
il seraBar
et vous avez tapénew Foo
il seraFoo
.Le prototype
La
prototype
propriété est utilisé pour la recherche dans le cas où l'objet en question ne possède pas la propriété demandé. Si vous écrivezx.attr
, JavaScript, essayez de trouverattr
parmix
s'attributs. Si il ne peux pas le trouver, il va regarder dansx.__proto__
. Si elle n'est pas là non plus, il va regarder dansx.__proto__.__proto__
et ainsi de suite tant que__proto__
est défini.Donc, qu'est-ce que
__proto__
et ce qu'il a eu à faire avecprototype
? Peu de temps mis,prototype
est pour les "types", tandis que__proto__
est de "cas". (Je dis ça avec des guillemets car il n'y a pas vraiment de différence entre les types et instances). Lorsque vous écrivezx = new MyType()
, ce qui se passe (entre autres choses), c'est quex.__proto___
est fixé àMyType.prototype
.La question
Maintenant, le dessus doit être tout ce que vous devez tirer de ce que votre propre exemple, que les moyens, mais pour essayer de répondre à votre question; "pourquoi écrire quelque chose comme":
Bar.prototype.constructor = Bar;
Personnellement, je ne l'ai jamais vu et je trouve ça un peu ridicule, mais dans le contexte que vous avez donné, il signifie que le
Bar.prototype
-objet (créé à l'aide denew Foo(42)
) présentera comme étant créé parBar
plutôt queFoo
. Je suppose que l'idée est quelque faire quelque chose de similaire à C++/Java/C#-comme les langues où un type de recherche (laconstructor
propriété) produisent toujours les plus spécifiques de type plutôt que le type de la plus générique de l'objet dans le prototype de la chaîne.Mon conseil: ne pense pas que beaucoup au sujet de "l'héritage" en JavaScript. Les concepts d'interfaces et de mixin a plus de sens. Et de ne pas vérifier les objets de leurs types. Vérifier les propriétés requises à la place ("si ça marche comme un canard et des charlatans comme un canard, c'est un canard").
D'essayer de forcer JavaScript dans un classique modèle d'héritage, quand tout ce qu'il a est le prototype du mécanisme, comme décrit ci-dessus, c'est ce qui provoque la confusion. Les nombreuses personnes qui ont suggéré de définir manuellement les
constructor
-propriété probablement essayé de faire exactement cela. Les Abstractions sont bien, mais de ce manuel à la cession de la propriété constructeur n'est pas très idiomatique de l'utilisation de JavaScript.constructor
propriété n'est pas très utile, mais en héritant d'un autre prototype de l'objet peut être extrêmement puissant et je ne voudrais pas vous décourager, c'est qu'à tous.Merci - c'est peut-être pas idiomatiques, mais de nombreux tutoriels sur le net (et q/a sur SE) suggèrent d'utiliser cette méthode particulière est "nécessaire" - comme si l'ensemble du modèle prototype des pauses si vous ne l'utilisez pas.
Oh, désolé si c'est comment il est venu à travers. Héritant d'une autre objets prototype n'est pas le problème; modifier le constructeur de propriété.
vous dites "Le
constructor
propriété ne pas en cause aucun des effets particuliers dans votre programme, sauf que vous pouvez regarder pour voir lequel la fonction a été utilisé en conjonction avec l'opérateurnew
créer votre objet. Si vous avez tapénew Bar()
il seraBar
et vous avez tapénew Foo
il seraFoo
." Ce n'est pas correct. Leconstructor
propriété fait référence à la fonction qui créé un objet donné de prototype, comme on le voit dans l'exemple, même par les OP."vous pouvez regarder pour voir lequel la fonction a été utilisé en conjonction avec l'opérateur new pour créer votre objet". Non, vous ne pouvez pas. Il fournit une indication quant à la fonction d'un objet prototype a d'abord un lien de parenté trop (à condition que le constructeur propriété n'a pas été réglé sur une autre valeur). Il vous dit rien pour certains à propos de l'instance qui en hérite.
OriginalL'auteur Jakob
un cas d'utilisation constructeur:
c'est l'une des communes de la réalisation de l'héritage:
ce
new f()
ne serait pas appeler le constructeur de la superclasse,de sorte que lorsque vous créez une sous-classe,vous devrez peut-être appeler la super-classe au premier abord,comme ceci:afin que le constructeur de la propriété de bon sens ici.
SubClass.superClass.call(this);
.Sauf si vous prévoyez de référence de la propriété constructeur sur l'instance, vous pouvez commenter les
p.constructor = this
ligne et rien ne change. La réponse pourrait démontrer le cas si leconstructor
propriété est utilisée, mais il n'explique pas pourquoi il est utilisé. Bref, cette réponse ne répond pas à la question initiale sur l'importance de laconstructor
de la propriété.1. Pouvez vous s'il vous plaît code un simple exemple d'utilisation? 2. Quel est le rôle de
override
?OriginalL'auteur Jack Hu
L'un des cas d'utilisation lorsque vous voulez la
prototype.constructor
propriété à survivreprototype
propriété réaffectation est lorsque vous définissez une méthode sur laprototype
qui produit de nouvelles instances d'un même type ou de l'instance. Exemple:Object.setPrototypeOf(BMW.prototype, Car.prototype);
au lieu deBMW.prototype = Object.create(Car.prototype);
?Ouais, ce qui permettrait de réduire paramètre du constructeur de l'étape. Nous devons user de ce droit??
OriginalL'auteur golem
La propriété constructeur points pour le constructeur qui a été utilisé pour créer l'instance de l'objet. Si vous avez tapé " nouveau Bar ()", il sera " Bar "et vous tapez" new Foo (), ce sera 'Foo'.
Mais si vous définissez le prototype sans paramètre du constructeur, vous obtiendrez quelque chose comme ceci:
Pour définir le constructeur en fait pour le constructeur qui a été utilisé pour créer l'objet, nous avons besoin de mettre le constructeur en tant que bien pendant le réglage d'un prototype comme suit:
OriginalL'auteur jsbisht