Javascript "abstrakte Methode"
Meiner Terminologie ist ein wenig aus, so fühlen sich frei, zu korrigieren, wo nötig. Ich möchte überladen einer Funktion in javascript und die 'Basis-Klasse', um die Verwendung der überladenen Methode sowie der geerbten Klasse zum Zugriff auf die Basisklassen-Methoden. Bisher kam ich mit eine (funktionierende) Mischung aus jquery.extend()
- und object-literalen, aber das sieht nicht schön aus. Ich Frage mich, ob es einen besseren Weg, dies zu tun (kann unter Verwendung der jquery).
var Base = new function(args, m) {
$.extend(this, m);
var self = this;
this.bar = function() {
self.foo();
}
this.foo = function() {
self.blah();
}
this.dosomething = function() {}
};
var Child = function(arg1) {
$.extend(this, new Base(args, {
blah: function() {
self.dosomething()
}
}));
}
- Ich vermute, das ist, eine obligatorische resource
- auf dieser Seite: "ich habe das schreiben von JavaScript für 8 Jahre jetzt, und ich habe nicht einmal gefunden, müssen verwenden Sie ein uber-Funktion. Die super Idee ist ziemlich wichtig in dem klassischen Muster, aber es scheint unnötig in der prototypal und funktionale Muster. Ich sehe jetzt meine ersten versuche zu unterstützen, das klassische Modell in JavaScript als ein Fehler."
- Ich bin immer die Idee, die Sie und Alexander sind im Einvernehmen mit Crockford, dass die klassische Vererbung ist eine schlechte Passform für Javascript, nicht?
- Ich denke, wir sind (In Absprache), war ich nicht streiten, ich dachte, es wäre schön, bringen Crockford ' s Schlussfolgerung, dass die Seite hier so, es wird mehr sichtbar. Es ist wahrscheinlich der wichtigste Teil dieser Seite 🙂
- Ja, Sie dachten, er würde spotlight, das bit an der Spitze. Wrrrd.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was Sie suchen, ist ein Weg, um die share-Funktion über Objekte.
Dies ist genau die Art von Sache, die JavaScript als prototypische Vererbung Modell zeichnet sich bei.
Gibt es keine Notwendigkeit zur Verwendung von jQuery oder anderen Bibliotheken, um dies zu erreichen. Erwägen Sie mit die Sprache die Art und Weise, Dinge zu tun.
Prototypen
In JavaScript-Objekte haben die "Prototypen". Bei JavaScript sieht für eine Methode in einem Objekt, das nicht haben, sieht es für es sich auf den Prototyp "Kette". So alle Sie tun müssen ist, überschreiben Sie diese Funktion auf einer niedrigeren Ebene auf, die Kette.
Dies ist ausführlich in das tutorial über es auf MDN.
Ihrem speziellen Fall
Wenn ich eine
Base
undChild
Klasse, wo dieBase
hat eine Methode, dieChild
Bedürfnisse zu überschreiben, alles, was wir tun müssen, ist, weisen Sie es überall senken in dieser Kette.Die Reihenfolge der look-up ist
Zum Beispiel, sagen wir, Sie haben eine Klasse Basis
Möchte ich Kind zu implementieren Bar anders, in dem Fall kann ich tun
Die Ergebnisse in
Hinweis Auf Abstrakte Klassen in JavaScript
Zwei der wichtigsten Gründe für die abstrakten Methoden, Vererbung verwendet wird, in Sprachen, die auf der Grundlage der klassischen Vererbung (wie Java) ist Polymorphismus und code-sharing.
In JavaScript weder ein problem. Code-sharing kann man mittels der prototypischen Vererbung genauso einfach. Moreoever, können Sie fast jede Funktion und führen Sie es in einem anderen Kontext. Zum Beispiel kann ich auch nennen, die
bar
Methode einerChild
Objekt auf ein leeres array zu tunb.bar.call([])
.Als für Polymorphismus JavaScript ist eine dynamische Sprache mit duck typing. Dies bedeutet, es sieht auf Objekte, basierend auf Ihrer Fähigkeit, und nicht so, wie Sie deklariert wurden. Wenn mehrere Objekte über eine Methode namens
bar
hätte ich kein problem ruft die Methode auf jedem von Ihnen, wenn Sie in einem array oder einer anderen Sammlung. In Java, der erforderlich wäre, eine gemeinsame Schnittstelle,, Typ-oder Vorfahren.Aus diesen Gründen Dinge wie abstrakte Klassen nicht spielen eine große Rolle in JavaScript.
Barrable
- Schnittstelle mit einer einzigen Methodebar
jedes dieser Objekte bedürfen der ausdrücklichen Klassen (Animal
,Car
undKid
entsprechend, jeder in seiner eigenen.java
- Datei), diese Klassen jeweils eineimplements Barrable
in Ihrer Klasse definition. Alternativ könnten Sie sich dafür entscheiden, dass ein Kind, ein Auto und ein Tier, Sie alle teilen ein Vorfahr, aber das ist wohl weniger wahrscheinlich 🙂Abstract
undInterface
Definitionen in mit oder ohne Methoden). Ich kann nicht sagen, ich habe keine Probleme per se mit dem klassischen Erbe, aber ich mag Javascript die prototypische Direktheit..prototype.foo = new function() {}' stuff go into the
Function Kind() {}' oder muss zugewiesen werden außerhalb?Child
haben den gleichen Prototyp, der ein Objekt vom TypBase
. Wenn der Basis-Konstruktor nimmt einen parameter im Konstruktor wäre es, gemeinsam über alle ObjekteChild
sowieso. Sie können tun, emulieren, Javasuper
wenn Sie möchten, indem Sie eineBase.call(this,whatever_parameter)
imChild
Konstruktor, aber das ist sehr selten in der Praxis, und würde etwas anderes bedeuten (dass seine eine Eigenschaft vonChild
und nichtBase
). In der Praxis sind diese Fälle nicht auftreten. Wieder in der Praxis von JavaScript ist OO aber klassenlose ..prototype.stuff
Sie tun können es im Konstruktor, aber es würde zuweisen verschiedenen - Funktion für jedes Objekt. Beachten Sie, dass JavaScript-Funktionen, die sind viel mächtiger als Java-Funktionen, da Sie Verschlüsse, D. H. Sie können eine variable im scope des Konstruktors (deklariert mit dervar
Schlüsselwort) und Funktionen deklariert im Konstruktor Zugriff haben wird es auch nachdem der Konstruktor fertig ist. Verschlüsse sind genial.c.prototype.foo()' instead of
c.foo()' ist ein bisschen nervig. Gibt es irgendetwas, was ich dagegen tun kann?Ich empfehlen, tun es die Art und Weise CoffeeScript tut es. Sie können die erste
var
Erklärung in einer separaten Datei zu halten, den code suchen nette. Soweit ich weiß__extends
entspricht$.extends
Oder, wenn Sie verwenden können, CoffeeScript, sieht es wie folgt aus: