Javascript, innere Klassen, und wie Sie Zugang zu übergeordneten Bereich effizient

In Javascript, ich möchte eine Klasse definieren, mit einem inneren (oder verschachtelt) sind Klasse. Innerhalb der inneren Klasse ich möchte in der Lage sein, um Zugang zu der übergeordneten Instanz. Wie kann ich das effizient?

Etwas code zeigen, was ich meine. Angenommen, ich definiere eine Klasse, MyType1, die enthält mehrere Eigenschaften und einer Funktion SayHello:

(function(){
    MyType1 = function(name){
        this.TypeName = "MyType1";
        this.Name = name;
    };

    MyType1.prototype.SayHello = function() {
        say(this.Name + " says hello...");
    };
})();

Ok, jetzt, starten von dort aus, möchte ich hinzufügen, dass eine "innere Klasse" MyType1, so dass ich fügen Sie einige neue code, so dass es wie folgt aussieht:

(function(){
    MyType1 = function(name){
        this.TypeName = "MyType1";
        this.Name = name;
        var parentName = name;
        this.Child = function(name) {
            this.Description = parentName + "'s child, " + name;
        };

        this.Child.prototype.Introduce = function() {
            say(this.Description + ", greets you...");
        };
    };

    MyType1.prototype.SayHello = function() {
        say(this.Name + " says hello...");
    };
})();

Nun kann ich diese Klassen verwenden, wie diese:

var x = new MyType1("Victor");
x.SayHello();

var c = new x.Child("Elizabeth");
c.Introduce();

dass alles funktioniert. Aber es definiert einen neuen Kind-Funktion (oder Typ, wenn Sie möchten) für jede Instanz von MyType1. Was ich gerne tun möchte, ist erhalten Sie Zugriff auf die parent-Klasse Rahmen, ohne Rückgriff auf, dass Ineffizienz.
So etwas wie dieses:

(function(){
    MyType2 = function(name){
        this.TypeName = "MyType2";
        this.Name = name;
        this.Prop1 = 1872;
        var parentName = name;
    };

    MyType2.prototype.SayHello = function() {
        say(this.Name + " says hello...");
    };

    var c1 = function(name) {
        this.Description = parentName + "'s child, " + name;
        //               ^^ no go! ^^
    };

    c1.prototype.Introduce = function() {
        say(this.Description + ", greets you...");
    };

    MyType2.prototype.Child = c1;

})();

Aber so funktioniert das nicht. Die parentName var out of scope, natürlich.

Ist es eine effiziente Möglichkeit für das Kind-Instanz (im Konstruktor, oder in jede Klasse, Funktion), um den Zugang zu den Eltern (MyType2) Instanz?


Ich weiß, dass ich definieren könnte, die Kind-Klasse eine unabhängige, nicht-geschachtelte Klasse, dann in der ctor für Sie, dass, einfach der Übergeordneten Instanz. Aber das schafft N Verweise auf die übergeordnete Instanz, eine für jedes Kind-Instanz. Das scheint wie eine Ineffizienz würde ich gerne vermeiden.

vielen Dank für alle Tipps.


BEARBEITEN - der Grund, warum ich möchte, dass das Kind Zugang zu der übergeordneten Instanz, ist, dass der Elternteil hält ein Objekt, das ist ziemlich aufwendig zu erstellen - so etwas wie ein db-Verbindungs - und ich möchte das Kind nutzen zu können, das Ding.

  • Ugh, noch mehr Missbrauch von Javascript zu bringen, in "OOP" Unsinn. Diese Sprache keine Klassen: wenn Sie möchten, verwenden Sie etwas, das funktioniert!
  • Sie können das nützlich finden: blog.niftysnippets.org/2009/09/... Es ' s eine Reihe von Hilfsfunktionen (und Erklärung davon), bietet eine einfache, aber effiziente Mittel zur Schaffung von "Unterklassen" von "Klassen" erstellt, die über prototypische Vererbung. Sieht aus wie Sie dies tun, ziemlich manuell, so kann es sparen Sie etwas ärger.
  • Du hast ganz Recht, natürlich, JavaScript muss nicht Klassen. Es ist Objekt-orientiert, und es tut Vererbung, obwohl.
  • Ich sehe nicht ein, warum würden Sie haben, um einen Verweis auf die übergeordnete Instanz die untergeordnete wenn Sie gehen mit Ihrer letzten Idee. Sie müssen nur übergeben werden, die parentName wenn das alles ist, die Sie verwenden, in die Kind-Klasse. Das scheint mir der richtige Weg OO das zu erreichen, was Sie zu tun versuchen.
  • Was ist der Zweck der anonymen wrapper-Funktion?
  • Bitte nutzen Sie die var Schlüsselwort zur Definition von lokalen Variablen. Wenn Sie möchten, um zu definieren, globals (bitte nicht), Sie definieren sich ausdrücklich als Eigenschaften des globalen Bereich.
  • In welcher Sprache beten Sie sagen würden, Sie benutzen andere als JavaScript für das scripting im browser?
  • Ich denke, der Punkt war, dass die gleichen OOP-Konzepte aus anderen Sprachen, sollte nicht direkt portiert, um JS.
  • Ich würde die Javascript verwenden. Ich würde nicht versuchen, schalten Sie ihn in eine schreckliche Greuel, obwohl!
  • Ich mache das nicht prototypal inheritance. Es ist eine verschachtelte/innere Klasse. Es gibt keine Vererbung in diesem Beispiel. @Vidas - die anon fn ist nur für scoping Hilfe in meinem code-Modul. Es fügt nichts zu dem Beispiel. @Tomalak - klingt wie Sie haben Hänger über das, was ich mit meinem code. Hmmm. Jemals daran gedacht, über zu sehen, ein Therapeut dazu?
  • Es gibt viele schreckliche Greuel erstellt wird, jeden Tag, wenn jemand öffnet gmail, yahoo mail, etc...
  • Abscheulichkeiten wie diese? developer.mozilla.org/en-US/docs/Web/JavaScript/...

InformationsquelleAutor Cheeso | 2011-01-22
Schreibe einen Kommentar