Ich habe viel Zeit damit verbracht, einfache Widgets für Projekte wie folgt zu entwickeln:
var project = project || {};
(function() {
project.elements = {
prop1: val1,
prop2: val2
}
project.method1 = function(val) {
// Do this
}
project.method2 = function(val) {
// Do that
}
project.init = function() {
project.method1(project.elements.prop1)
project.method2(project.elements.prop2)
}
})()
project.init();
Aber ich habe begonnen, mein Format folgendermaßen zu ändern:
function Project() {
this.elements = {
prop1: val1,
prop2: val2
}
this.method_one(this.elements.prop1);
this.method_two(this.elements.prop2);
}
Project.prototype.method_one = function (val) {
//
};
Project.prototype.method_two = function (val) {
//
};
new Project();
Zugegeben, das sind dumme Beispiele, also lasst euch nicht um die Achse wickeln. Aber was ist der funktionale Unterschied und wann soll ich den einen oder anderen auswählen?
design-patterns
javascript
prototyping
JDillon522
quelle
quelle
project
Deklaration versehentlich in die Funktion eingefügt. Aktualisiert.Antworten:
Der erste Unterschied kann wie folgt zusammengefasst werden:
this
Bezieht sich auf die Instanz der Klasse.prototype
bezieht sich auf Definition .Nehmen wir an, wir haben folgende Klasse:
Hier hängen wir also
this.number
an jeder Instanz der Klasse, und es ist sinnvoll, weil jedeFlight
ihre eigene Flugnummer haben sollte.Im Gegensatz dazu
prototype
definiert eine einzige Eigenschaft , die durch alle Instanzen zugegriffen werden kann.Wenn wir nun die Flugnummer erhalten möchten, können wir einfach das folgende Snippet schreiben und alle unsere Instanzen erhalten eine Referenz auf dieses neu erstellte Objekt.
Der zweite Unterschied betrifft die Art und Weise, wie JavaScript nach einer Eigenschaft eines Objekts sucht. Wenn Sie suchen ,
Object.whatever
geht JavaScript den ganzen Weg bis zum Hauptobjekt Objekt (das Objekt , dass alles andere aus geerbt hat), und sobald sie eine Übereinstimmung findet , wird es zurückgeben oder es nennen.Dies geschieht jedoch nur für die prototypisierten Eigenschaften. Wenn Sie also eine höhere Ebene haben
this.whatever
, wird JavaScript diese nicht als Übereinstimmung betrachten und die Suche fortsetzen.Mal sehen, wie es in der Realität passiert.
Beachten Sie zunächst, dass [fast] alles Objekte in JavaScript sind. Versuche dies:
Nun wollen wir sehen , was in einem ist
Object
( man beachte die Groß-O
und.
am Ende). In den Entwicklertools von Google Chrome erhalten.
Sie beim Aufrufen von eine Liste der verfügbaren Eigenschaften in diesem bestimmten Objekt.Tun Sie jetzt dasselbe für
Function
:Möglicherweise bemerken Sie die
name
Methode. Geht einfach und macht es an und lasst uns sehen, was passiert:Nun erstellen wir eine Funktion:
Und mal sehen, ob wir die
name
Methode auch hier haben:Sie sollten eine leere Zeichenfolge erhalten, aber das ist in Ordnung. Sie sollten keinen Fehler oder eine Ausnahme erhalten.
Jetzt wollen
Object
wir etwas zu diesem gottähnlichen hinzufügen und sehen, ob wir es auch an anderen Orten bekommen?Und los geht's:
In allen Fällen sollten Sie sehen
"Okay!"
.In Bezug auf die Vor- und Nachteile jeder Methode können Sie Prototyping als "effizientere" Methode betrachten, da es eine Referenz für jede Instanz enthält, anstatt die gesamte Eigenschaft in jedem Objekt zu kopieren. Auf der anderen Seite ist es ein Beispiel für enge Kopplung, die ein großes Nein ist, bis Sie den Grund wirklich rechtfertigen können.
this
ist ziemlich kompliziert, da es für den Kontext relevant ist. Sie können viele gute Ressourcen kostenlos im Internet finden.Alles in allem sind beide Möglichkeiten nur Sprachwerkzeuge und es hängt wirklich von Ihnen und dem Problem ab, das Sie zu lösen versuchen, um herauszufinden, was besser passt.
Wenn Sie eine Eigenschaft benötigen, die für jede Instanz einer Klasse relevant ist, verwenden Sie
this
. Wenn Sie eine Eigenschaft benötigen, die auf jeder Instanz gleich funktioniert, verwenden Sieprototype
.Aktualisieren
In Bezug auf Ihre Beispiel-Snippets ist der erste ein Beispiel für Singleton , daher ist es sinnvoll, ihn im Objektkörper zu verwenden
this
. Sie können Ihr Beispiel auch verbessern, indem Sie es so modular gestalten (und Sie müssen es nicht immer verwendenthis
).Ihr zweites Snippet macht nicht viel Sinn, weil Sie es zuerst verwenden
this
und später versuchen, es zu hackenprototype
, was nicht funktioniert, weil esthis
Vorrang hatprototype
. Ich bin mir nicht sicher, welche Erwartungen Sie an diesen Code hatten und wie er funktionierte, aber ich empfehle Ihnen dringend, ihn umzugestalten.Aktualisieren
Um näher darauf
this
einzugehen,prototype
kann ich Ihnen ein Beispiel zeigen und erklären, wie es erklärt werden kann, aber ich habe keine externe Ressource, um es zu sichern.Das Beispiel ist sehr einfach:
Die Erklärung ist, wie wir wissen,
this
kontextbezogen. Es entsteht also erst, wenn der Kontext bereit ist. Wann ist der Kontext fertig? Wenn die neue Instanz erstellt wird! Sie sollten den Rest jetzt erraten! Das bedeutet, dass es zwar eineprototype
Definition gibt, es jedochthis
sinnvoller ist, Vorrang zu haben, da es sich nur um die neue Instanz handelt, die in diesem Moment erstellt wird.quelle
this
im albernen Prototyp-Beispiel verwendet, weil esthis
sich auf seine eigenen Eigenschaften bezieht, einschließlich seiner Methoden. Ich lerne nicht das Beste aus dem Lesen von Code, sondern mehr aus dem Betrachten von Code. ( MDN ist ein bisschen drauf , Object Playground (erstaunlich) und ein paar andere). Können Sie auf etwas verweisen, das erklärt, was Sie unter "this
Vorrang vorprototype
" verstehen ? Ich würde gerne mehr darüber nachdenken.