Was es die Bedeutung der Javascript constructor-Eigenschaft?
Versucht zu biegen, indem Sie den Kopf um Javascript auf OO...und wie bei vielen anderen, läuft in die Verwirrung über die constructor
Eigenschaft. Insbesondere die Bedeutung der constructor
Eigenschaft, wie ich kann nicht scheinen, um es wirksam ist. 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`.
Im obigen Beispiel wird das Objekt b
scheint gehabt zu haben, die richtige Konstruktor aufgerufen (Bar
) – und übernimmt es die age-Eigenschaft von Foo
. Also, warum viele Leute empfehlen dies als einen notwendigen Schritt:
Bar.prototype.constructor = Bar;
Klar, das Recht Bar
Konstruktor war aufgerufen wird, wenn der Bau b
, also wie wirkt sich das prototype-Eigenschaft haben? Ich bin neugierig zu erfahren, welchen praktischen Unterschied macht es wirklich, haben die constructor-Eigenschaft festgelegt ist "richtig" —weil ich ihn nicht sehen kann haben einen Einfluss auf die Konstruktor ist eigentlich aufgerufen, nachdem ein Objekt erstellt wird.
InformationsquelleAutor aaa90210 | 2010-10-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
constructor
Eigenschaft macht absolut keinen praktischen Unterschied um alles intern. Es ist nur jedem zu verwenden, wenn der code explizit verwendet. Zum Beispiel können Sie sich entscheiden, müssen Sie jedes Ihrer Objekte eine Referenz auf das eigentliche Konstruktor-Funktion, die es erstellt hat; wenn dem so ist, müssen Sie dieconstructor
Eigenschaft explizit beim einrichten der Vererbung durch die Zuordnung eines Objekts zu einer Konstruktorfunktionprototype
Eigenschaft, wie in deinem Beispiel.constructor
ist ein wichtiger Teil des seins in der Lage, shimObject.getPrototypeOf
. Ich persönlich benutzeObject.getPrototypeOf
und davon ausgehen, jeder bricht nicht dieprototype
<->constructor
BeziehungNicht die sicherste Annahme, aber wahrscheinlich sicherer, als es früher war. Gehen ein paar Jahre zurück und fast alle JavaScript-Objekt Vererbung tutorials im web waren Java-beeinflusst und empfohlen wird die manuelle Einstellung der
constructor
Eigenschaft. Sie und ich haben ganz unterschiedliche ethoses: ich viel lieber Wrapper-shims, und haben gelebt, ohneObject.getPrototypeOf
so lange, dass ich nicht den brennenden Wunsch, für den es jetzt hat.Der wichtigste Punkt ist, dass wir die Menschen warnen, die für ES5-Konformität dieses Verhältnis sollte nicht gebrochen werden, auch in älteren Browsern
Ich denke, ich würde erwägen, sich auf die
constructor
Eigenschaft, die, wie besprochen, hat eine Geschichte des seins experimentiert mit scripts und ist ansonsten von keinerlei nutzen, eine unzumutbare Anforderung für jeder shim und würde nicht empfehlen, mit ihm im Allgemeinen.Wir sollten diese Diskussionen im chat, aber es ist ein timesuck.
InformationsquelleAutor Tim Down
Schritt eins ist, zu verstehen, was
constructor
undprototype
sind alle über. Es ist nicht schwierig, aber man hat sich gehen zu lassen "Vererbung" im klassischen Sinne.Der Konstruktor
Den
constructor
Eigenschaft nicht verursachen keine besonderen Wirkungen in Ihrem Programm, außer, Sie können es betrachten, um zu sehen, welche Funktion verwendet wurde, in Verbindung mit dem operatornew
das Objekt zu erstellen. Wenn Sie eingegeben habennew Bar()
es wirdBar
und Sie tipptenew Foo
es wirdFoo
.Der Prototyp
Den
prototype
Eigenschaft für die Suche verwendet wird, im Falle das betreffende Objekt nicht die Eigenschaft haben gefragt. Wenn Sie schreibenx.attr
JavaScript wird versuchen zu findenattr
unterx
's Attribute. Wenn Sie nicht finden können, wird es Aussehen, inx.__proto__
. Wenn es nicht gibt, entweder, es wird sich inx.__proto__.__proto__
und so weiter, solange__proto__
definiert ist.Also, was ist
__proto__
und was hat es zu tun mitprototype
? Kurz gesagt,prototype
ist für "Typen", während__proto__
ist für die "Instanzen". (Ich sage das mit Anführungszeichen, denn es gibt nicht wirklich einen Unterschied zwischen Typen und Instanzen). Wenn Sie schreibenx = new MyType()
, was passiert (unter anderem) ist, dassx.__proto___
eingestellt istMyType.prototype
.Die Frage
Nun, das soll alles, was Sie brauchen, um abzuleiten, was das eigene Beispiel, aber versuchen, die Antwort auf Ihre eigentliche Frage; "warum schreiben Sie so etwas wie":
Bar.prototype.constructor = Bar;
Ich persönlich habe es nie gesehen, und ich finde es ein wenig albern, aber in dem Kontext, die Sie gegeben haben, wird es bedeuten, dass die
Bar.prototype
-Objekt (erstellt mitnew Foo(42)
) darstellen, haben vonBar
eher alsFoo
. Ich nehme an, die Idee ist, einige machen etwas ähnliches wie C++/Java/C#-ähnliche Sprachen, wo ein Typ-lookup (derconstructor
- Eigenschaft) immer Ausbeute der meisten spezifischen Art eher als der Typ der mehr generischen Objekt, das sich weiter oben in der Prototyp-Kette.Mein Rat: glaube nicht, dass sehr viel über "Vererbung" in JavaScript. Die Konzepte von interfaces und Mixins in Verbindung macht mehr Sinn. Und nicht die Objekte prüfen, die für Ihre Typen. Überprüfen Sie die erforderlichen Eigenschaften statt ("wenn es läuft wie eine Ente und quakt wie eine Ente, ist eine Ente").
Versucht zu zwingen, JavaScript-Code in eine klassische Erbe-Modell, wenn alle, die es hat, ist der Prototyp-Mechanismus, wie oben beschrieben, ist das, was bewirkt, dass die Verwirrung. Die vielen Menschen, die vorgeschlagen, dass manuell die
constructor
-Eigenschaft wahrscheinlich versucht, genau das zu tun. Abstraktionen sind in Ordnung, aber diese manuelle Zuordnung der constructor-Eigenschaft ist nicht sehr idiomatische Verwendung von JavaScript.constructor
Eigenschaft ist nicht sehr nützlich, aber Erben von einem anderen Objekt dem Prototyp kann sehr mächtig sein und ich würde nicht entmutigen.Vielen Dank - es kann nicht sein, idiomatischer, aber viele der Anleitungen im Netz (und q/a 's an SE) empfehlen die Verwendung dieser speziellen Methode ist "gebraucht" - als ob die ganze Prototyp-Modell in den Pausen, wenn Sie ihn nicht verwenden.
Oh, sorry, wenn das ist, wie es gekommen ist. Erben von anderen Objekten Prototyp ist nicht das problem; die änderung der constructor-Eigenschaft ist.
Sie sagen: "Die
constructor
- Eigenschaft nicht verursachen keine besonderen Wirkungen in Ihrem Programm, außer, Sie können es betrachten, um zu sehen, welche Funktion verwendet wurde, in Verbindung mit dem operatornew
das Objekt zu erstellen. Wenn Sie eingegeben habennew Bar()
es wirdBar
und Sie tipptenew Foo
es wirdFoo
." Dies ist nicht korrekt. Dieconstructor
- Eigenschaft bezieht sich auf die Funktion erstellt ein Objekt ist Prototypen, wie im Beispiel, sogar von der OP."Sie können es betrachten, um zu sehen, welche Funktion verwendet wurde, in Verbindung mit dem operator new zum erstellen von Ihrem Objekt". Nein, das können Sie nicht. Es bietet einen Hinweis auf die Funktion ein Prototyp-Objekt wurde zunächst im Zusammenhang zu (vorausgesetzt, das Konstruktor - Eigenschaft wurde nicht festgelegt, um einen anderen Wert). Es sagt nichts bestimmtes über die Instanz erbt.
InformationsquelleAutor Jakob
einem Fall zu verwenden Konstruktor:
dies ist einer der gemeinsamen Realisierung von Vererbung:
diese
new f()
würde nicht rufen Sie den Konstruktor der Oberklasse,also, wenn Sie erstellen eine Unterklasse,vielleicht müssen Sie rufen Sie die Oberklasse auf den ersten,wie diese:also die constructor-Eigenschaft machen hier Sinn.
SubClass.superClass.call(this);
.Es sei denn, Sie planen, einen Verweis auf die constructor-Eigenschaft auf die Instanz, können Sie sicher Kommentar der
p.constructor = this
Zeile und ändert sich nichts. Die Antwort könnte zeigen, der Fall ist wenn dieconstructor
- Eigenschaft verwendet, aber es erklärt nicht, warum es wird dort benutzt. Kurz diese Antwort keine Antwort auf die ursprüngliche Frage über die Bedeutung derconstructor
Eigenschaft.1. Kannst du bitte den code ein einfaches Beispiel? 2. Was ist die Rolle der
override
?InformationsquelleAutor Jack Hu
Einer der use-cases, wenn Sie möchten, die
prototype.constructor
- Eigenschaft, um zu überlebenprototype
Eigenschaft Umwidmung ist, wenn Sie eine Methode definieren, die auf dieprototype
erzeugt neue Instanzen des gleichen Typs von der jeweiligen Instanz. Beispiel:Object.setPrototypeOf(BMW.prototype, Car.prototype);
stattBMW.prototype = Object.create(Car.prototype);
?Ja, das verringern würde die Einstellung Konstruktor Schritt. Wir sollten von diesem Recht Gebrauch??
InformationsquelleAutor golem
Die constructor-Eigenschaft Punkte an den Konstruktor, der verwendet wurde, um das Objekt zu erstellen Instanz. Wenn Sie typisierte " new Bar()' es werden die 'Bar' und man tippte 'new Foo()' es wird 'Foo'.
Aber wenn Sie den Prototyp, ohne den Konstruktor, würden Sie bekommen so etwas wie dieses:
Einstellen der Konstruktor auch den Konstruktor, der verwendet wurde, um das Objekt zu erstellen, müssen wir um den Konstruktor als auch beim festlegen der Prototyp wie folgt:
InformationsquelleAutor jsbisht