Können JavaScript-Klassen / -Objekte Konstruktoren haben? Wie entstehen sie?
javascript
oop
Klicken Sie auf Upvote
quelle
quelle
Antworten:
Prototypen verwenden:
"Farbe" ausblenden (ähnelt etwas einer privaten Mitgliedsvariablen):
Verwendungszweck:
quelle
color
. Ich würde vorschlagen, welche Sie verwenden, hängt weitgehend vonvar
macht eine private Variable.this
macht eine öffentliche VariableFoo
, während er im letzteren Fall weiß, dassFoo
er aufgerufen wird. Sehr hilfreich beim Debuggen.Hier ist eine Vorlage, die ich manchmal für OOP-ähnliches Verhalten in JavaScript verwende. Wie Sie sehen können, können Sie private (sowohl statische als auch Instanz-) Mitglieder mithilfe von Closures simulieren. Was zurückgegeben
new MyClass()
wird, ist ein Objekt mit nur den Eigenschaften, die demthis
Objekt und imprototype
Objekt der "Klasse" zugewiesen sind .Ich wurde nach der Vererbung anhand dieses Musters gefragt.
Und ein Beispiel, um alles zu nutzen:
Wie Sie sehen können, interagieren die Klassen korrekt miteinander (sie teilen die statische ID von
MyClass
, dieannounce
Methode verwendet die richtigeget_name
Methode usw.)Eine Sache zu beachten ist die Notwendigkeit, Instanzeigenschaften zu beschatten. Sie können die
inherit
Funktion tatsächlich alle Instanzeigenschaften (mithasOwnProperty
) durchlaufen lassen, die Funktionen sind, und automatisch einesuper_<method name>
Eigenschaft hinzufügen . Auf diese Weise können Sie aufrufen,this.super_get_name()
anstatt es in einem temporären Wert zu speichern und es gebunden mit aufzurufencall
.Bei Methoden für den Prototyp müssen Sie sich jedoch nicht um die oben genannten Punkte kümmern. Wenn Sie auf die Prototypmethoden der Superklasse zugreifen möchten, können Sie einfach aufrufen
this.constructor.super.prototype.methodName
. Wenn Sie es weniger ausführlich gestalten möchten, können Sie natürlich praktische Eigenschaften hinzufügen. :) :)quelle
cls.prototype
Teil: "Instanzenübergreifend geteilt" dient nur zum Lesen des Werts (Aufrufannounce
). Wenn Sie einenmyClassInstance.announce
anderen Wert festlegen , wird eine neue Eigenschaft in erstelltmyClassInstance
, sodass dies nur für dieses Objekt gilt, nicht für andere Instanzen der Klasse. Das Zuweisen zu wirkt sichMyClass.prototype.announce
jedoch auf alle Instanzen aus.MyClass.get_nextId()
Es scheint mir, dass die meisten von Ihnen ein Beispiel für Getter und Setter geben, die kein Konstruktor sind (dh http://en.wikipedia.org/wiki/Constructor_(object-oriented_programming) .
Mittagessen-Dan war näher, aber das Beispiel funktionierte nicht in jsFiddle.
In diesem Beispiel wird eine private Konstruktorfunktion erstellt, die nur während der Erstellung des Objekts ausgeführt wird.
Wenn Sie öffentliche Eigenschaften zuweisen möchten, kann der Konstruktor wie folgt definiert werden:
quelle
Box()
Funktion handelt :). Dieses Beispiel sowie Beispiele in den anderen Antworten können jedoch leicht erweitert werden, um Parameter zu akzeptieren.Box
Funktion und Sie können loslegen (es ist immer noch "privat"). "Privat" in Javascript bedeutet nur, über den lexikalischen Bereich zugänglich zu sein. Keine Notwendigkeit, Mitgliedern zuzuweisen. Zusätzlich: Dieser Code ist falsch. Es wird eine globale__construct
Variable erstellt, was ziemlich schlecht ist.var
sollte verwendet werden, um den Umfang von einzuschränken__construct
.Der Zweck der Konstruktoreigenschaft besteht darin, eine Möglichkeit bereitzustellen, so zu tun, als ob JavaScript Klassen hat. Sie können den Konstruktor eines Objekts nach seiner Erstellung nicht sinnvoll ändern. Es ist kompliziert.
Ich habe vor einigen Jahren ein ziemlich umfassendes Stück darüber geschrieben: http://joost.zeekat.nl/constructors-considered-mildly-confusing.html
quelle
Beispiel hier: http://jsfiddle.net/FZ5nC/
Probieren Sie diese Vorlage aus:
Sie müssen Ihren Namespace anpassen, wenn Sie eine statische Klasse definieren:
Beispielklasse:
Beispielinstanziierung:
Hinweisfunktionen sind definiert als AB = Funktion A_B (). Dies soll das Debuggen Ihres Skripts erleichtern. Öffnen Sie das Inspect Element-Bedienfeld von Chrome, führen Sie dieses Skript aus und erweitern Sie den Debug-Backtrace:
quelle
Dies ist ein Konstruktor:
Wenn Sie das tun
MyClass
wird ausgeführt und ein neues Objekt dieser Klasse zurückgegeben.quelle
alert(valuePassedInAsArgument);
, dass dies ganz oben in Ihrer Klasse steht. Dies wird für jede Instanziierung einmal ausgeführt, sodass die gesamte Klasse der Konstruktor selbst ist.new object is returned of that class
- Ist es nicht eher so, als würde ein neues Objekt dieser Funktion zurückgegeben?Ich fand dieses Tutorial sehr nützlich. Dieser Ansatz wird von den meisten jQuery-Plug-Ins verwendet.
http://www.htmlgoodies.com/html5/tutorials/create-an-object-oriented-javascript-class-constructor.html#fbid=OVYAQL_TDpK
Jetzt ,
quelle
klass
Dieses Muster hat mir gut gedient. Mit diesem Muster erstellen Sie Klassen in separaten Dateien und laden sie "nach Bedarf" in Ihre gesamte App.
quelle
var
im Konstruktor (oder Funktionsargument oder in einer konstruktorähnlichen Funktion).Ja, Sie können einen Konstruktor in einer Klassendeklaration wie folgt definieren:
quelle
Ich werde wohl posten, was ich mit dem Schließen von Javascript mache, da noch niemand das Schließen verwendet.
Kommentare und Vorschläge zu dieser Lösung sind willkommen. :) :)
quelle
Mit dem obigen Beispiel von Nick können Sie einen Konstruktor für Objekte ohne Parameter erstellen, indem Sie eine return-Anweisung als letzte Anweisung in Ihrer Objektdefinition verwenden. Geben Sie Ihre Konstruktorfunktion wie folgt zurück, und der Code wird bei jeder Erstellung des Objekts in __construct ausgeführt:
quelle
this.getColor();
in der obigen Zeile zu verwenden, wirdalert("Object Created.");
nichts alarmiert. Es wird ein Fehler wie "getColor ist nicht definiert" angezeigt. Wenn Sie möchten, dass das Konstrukt andere Methoden im Objekt aufrufen kann, muss es nach allen anderen Methoden definiert werden. Anstatt also__construct();
die letzte Zeile aufzurufen, definieren Sie einfach das Konstrukt dort unten und setzen()
Sie es nach, um die automatische Ausführung zu erzwingen.()
am Ende der __construct-Definition führte immer noch zu dem Fehler. Ich musste__construct();
wie im Originalcode in einer eigenen Leitung anrufen , um den Fehler zu vermeiden.Vielleicht ist es etwas einfacher geworden, aber im Folgenden habe ich mir 2017 Folgendes ausgedacht:
Bei Verwendung der obigen Klasse habe ich Folgendes:
Wie Sie sehen können, akzeptiert der Konstruktor zwei Parameter, und wir legen die Eigenschaften des Objekts fest. Wir ändern auch die Farbe und Form des Objekts mithilfe der
setter
Funktionen und beweisen, dass seine Änderung beim AufrufgetInfo()
nach diesen Änderungen erhalten blieb.Ein bisschen spät, aber ich hoffe das hilft. Ich habe dies mit einem
mocha
Unit-Test getestet und es funktioniert gut.quelle
Sie tun dies, wenn Sie Typescript verwenden - Open Source von MicroSoft :-)
Mit Typescript können Sie OO-Konstrukte "fälschen", die zu Javascript-Konstrukten kompiliert werden. Wenn Sie ein großes Projekt starten, sparen Sie möglicherweise viel Zeit und haben gerade die Version 1.0 erreicht.
http://www.typescriptlang.org/Content/TypeScript%20Language%20Specification.pdf
Der obige Code wird kompiliert zu:
quelle
In JavaScript definiert der Aufruftyp das Verhalten der Funktion:
func()
obj.func()
new func()
func.call()
oderfunc.apply()
Die Funktion wird beim Aufruf mit dem Operator als Konstruktor aufgerufen
new
:Jede Instanz oder jedes Prototypobjekt in JavaScript verfügt über eine Eigenschaft
constructor
, die auf die Konstruktorfunktion verweist.Überprüfen Sie diesen Beitrag über die Konstruktoreigenschaft.
quelle
Während ich die großartige Vorlage von Blixt von oben verwendete, stellte ich fest, dass sie mit der mehrstufigen Vererbung (MyGrandChildClass, die MyChildClass erweitert, um MyClass zu erweitern) nicht gut funktioniert. Der Aufruf des Konstruktors des ersten Elternteils erfolgt immer wieder. Hier ist eine einfache Problemumgehung: Wenn Sie eine mehrstufige Vererbung benötigen, anstatt die
this.constructor.super.call(this, surName);
VerwendungchainSuper(this).call(this, surName);
mit der wie folgt definierten Kettenfunktion zu verwenden:quelle
http://www.jsoops.net/ ist ziemlich gut für oop in Js. Wenn Sie private, geschützte, öffentliche Variablen und Funktionen sowie Vererbungsfunktionen bereitstellen. Beispielcode:
quelle
nur um etwas Abwechslung zu bieten. ds.oop ist eine gute Möglichkeit, Klassen mit Konstruktoren in Javascript zu deklarieren. Es unterstützt jede mögliche Art der Vererbung (einschließlich eines Typs, den selbst c # nicht unterstützt) sowie Schnittstellen, was sehr hilfreich ist.
quelle
Hier müssen wir einen Punkt im Java-Skript beachten, es ist eine klassenlose Sprache, aber wir können es erreichen, indem wir Funktionen im Java-Skript verwenden. Der häufigste Weg, um dies zu erreichen, besteht darin, eine Funktion im Java-Skript zu erstellen und ein neues Schlüsselwort zum Erstellen eines Objekts zu verwenden und dieses Schlüsselwort zum Definieren von Eigenschaften und Methoden zu verwenden. Unten sehen Sie das Beispiel.
quelle
In den meisten Fällen müssen Sie die benötigte Eigenschaft irgendwie deklarieren, bevor Sie eine Methode aufrufen können, die diese Informationen übergibt. Wenn Sie zunächst keine Eigenschaft festlegen müssen, können Sie einfach eine Methode innerhalb des Objekts wie folgt aufrufen. Wahrscheinlich nicht die schönste Art, dies zu tun, aber das funktioniert immer noch.
quelle