Geschachtelte Klasse in javascript Vererbung von privaten Methoden
ich bin ziemlich ein Neuling in javascript, und ich bin einige Zeit damit zu verbringen, die versuchen, um Namespace-Objekte in js.
Nun, das ist, was ich versuche zu tun:
MainObject = function() {
var privateVariable = "i'm private";
var privateMethod = function() {
//doSomething
}
this.publicMethod = function() {
//doPublicSomething
}
}
MainObject.prototype.nested = function() {
this.publicNestedMethod = function() {
//that's not working at all
this.privateMethod(privateVariable);
}
}
MyObject = new MainObject();
MyObject.publicMethod();
MyObject.publicNestedMethod();
Ich habe versucht, um die geschachtelte Klasse innerhalb der ersten ein, aber es funktioniert nicht auch wenn ich es versuchen:
this.nested = function() {
var mainObject = this;
return {
publicNestedMethod = function() {
mainObject.privateMethod();
}
}
}();
Kann mir jemand helfen bitte? i ' m gonna lose my mind auf.
Phaedra.
InformationsquelleAutor Phaedra | 2010-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verschlüsse sind eine lexikalische Funktion, nicht eine semantische. Wenn sich das Objekt außerhalb der lexikalischen Umfang von anderen, kann es nicht mehr werden "verschachtelt" und den Zugang der ehemaligen lokalen Variablen. In den code der verschachtelten Funktion/Klasse, es gibt keine solche Sache wie
this.privateMethod
, weilprivateMethod
ist nie gemacht zu werden, eine Eigenschaft derMainObject
. Es ist einfach eine lokale variable innerhalb einer Funktion.Gibt es keine solche Dinge wie "private Liegenschaften", "private Methoden" oder "private member" in JavaScript. Hölle, es gibt keine solche Sache wie eine "Klasse". Einige Leute mögen zu emulieren, private Mitglieder, die mit lokalen Variablen wie oben, aber dies führt in Fällen wie diesem, wo die Diskrepanz zwischen den beiden Konzepten kommt und beißt einem in den Hintern.
Zum Abschluss, es ist eine schlechte Idee, das schreiben von Java-code, mit all seinen OO-Techniken in JS, wie es ist eine schlechte Idee, zu schreiben C-code, mit all seinen Zeigern und unbegrenzten Puffer, in C#. Sicher, in beiden Fällen können Sie es tun, aber Sie würde scheitern, zu schätzen und zu nutzen, die Sprache bietet diese Möglichkeit.
Und jetzt, wo ich fertig bin mit schimpfen, Sie können so etwas wie dies tun, um "Namespace" - Funktionen:
Müssen Sie Klammern um die Funktion (Erklärung vs Ausdrucks finden Sie unter yura.thinkweb2.com/named-function-expressions). Andere als das, es ist genau das, was ein Verschluss ist - du bist Kapselung von lokalen Variablen, die bei der Erstellung einer Funktion der Zeit. Bearbeitet die Antwort an einem Beispiel.
Also das ist, was ich war auf der Suche, denke ich. oder Nicht? mir fehlte die parethesis..
Ich bin mir nicht ganz sicher, was es war, Sie waren auf der Suche für, aber ein Blick auf deinen code, das Hauptproblem ist, dass Sie behandelt lokale Variablen als Objekt Eigenschaften.
InformationsquelleAutor Max Shawabkeh
Anhand der Konvention der Unterstrich für "private" - Methoden ist ein vernünftiger Weg, um die Dinge organisiert.
InformationsquelleAutor morgancodes
Gut zu nutzen prototypal inheritance, wo alle "Unterklassen", die gemeinsam eine einzige Instanz der Methode, die im Prototypen, aber AUCH die Funktion von Erben private Instanzen...
Ich kam mit:
Wie sinnvoll ist das?
InformationsquelleAutor Brett
Was OO-system können Sie Erben, private Methoden? Ein Teil des privaten wird unzugänglich wären von anderen Objekten.
In JS insbesondere "private member" sind wirklich nur die lokalen Variablen der Funktion, in der Sie deklariert sind. JS haben nicht die typische OO-Begriffe "Klasse", "Erbe", "public" und "private", also können Sie nicht erwarten, zu kopieren Ihre OOP-Techniken, die wörtlich aus anderen OOP-Sprachen.
Denken Sie daran, dass JavaScript wie Java nur dem Namen nach. Sie sind so unterschiedlich, dass Sie nicht erwarten können, dass alles in JS zu arbeiten, die gleichen wie in Java. Da JS nicht haben Klassen pro se, es nicht über innere Klassen.
InformationsquelleAutor Gabe
Es ist eine Konvention. Sie können imitieren OO Java-Techniken wie private Mitglieder, aber das ist nicht empfehlenswert. Sie können imitieren auf diese Weise:
Dies ist die besten Ansatz, den ich gefunden zu emulieren OO Java-Techniken...
Aber es ein problem gibt, ist sehr ineffizient...
Müssen Sie mit Prototypen statt, da es sonst schaffen würde, die ein Objekt pro Funktion pro Instanz von "Klasse".
Wie Sie denken, private Mitglieder sind (auf diese Weise) eine Konvention.
Auch, es ist eine andere Sache, die Sie wissen müssen...
Wenn Sie übergeben eine Funktion ein Objekt als parameter an eine andere Funktion, Sie müssen binden den Kontext der Funktion...
Dies ist, weil Sie gebunden werden muss "dieses" als Instanz in den Körper des publicFunction, sonst ist gonna be "Fenster" statt.
InformationsquelleAutor mpccolorado