Javascript, l'intérieur des classes, et comment accéder à portée parent efficacement

En Javascript, je voudrais définir une classe avec un intérieur (ou imbriquée) de la classe. Dans l'intérieur de la classe, je voudrais être en mesure d'obtenir l'accès à l'instance parent. Comment puis-je le faire efficacement?

Un peu de code va vous montrer ce que je veux dire. Supposons que je définir une classe, MyType1, qui expose un certain nombre de propriétés et une fonction SayHello:

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

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

Ok, maintenant, à partir de là, je veux ajouter un "intérieure" à MyType1, j'ai donc ajouter un peu de nouveau code de sorte qu'il ressemble à ceci:

(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...");
    };
})();

Maintenant, je peux utiliser ces classes comme ceci:

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

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

que toutes les œuvres. Mais il définit une nouvelle fonction d'Enfant (ou type, si vous le souhaitez) pour chaque instance de MyType1. Ce que je voudrais faire est d'obtenir l'accès à la classe parent champ d'application, sans avoir recours à cette inefficacité.
Quelque chose comme ceci:

(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;

})();

Mais, cela ne fonctionne pas. Le parentName var est hors de portée, bien sûr.

Est-il un moyen efficace pour l'Enfant instance (dans le constructeur, ou de toute fonction de classe) pour accéder à la mère (MyType2) instance?


Je sais que je pourrais définir la classe Enfant à être indépendant, non-classe imbriquée, puis dans le ctor pour cela il suffit de passer le Parent de l'instance. Mais cela crée N références à l'instance parent, un pour chaque Enfant de l'instance. Cela ressemble à une inefficacité je voudrais éviter.

merci pour les conseils.


MODIFIER - la raison pour laquelle je tiens à l'Enfant d'avoir accès à l'instance parent, c'est que le parent est titulaire d'un objet qui est assez cher pour créer quelque chose comme une connexion db - et j'aimerais que l'enfant à être en mesure d'utiliser cette chose.

Pouah, encore plus d'abus de Javascript pour apporter "programmation orientée objet" non-sens. Cette langue n'ayant pas de classes: si vous le souhaitez, utiliser quelque chose qui ne!
Vous pouvez trouver cela utile: blog.niftysnippets.org/2009/09/... C'est un ensemble de fonctions d'assistance (et l'explication de celui-ci) qui fournit un moyen simple, mais efficace, des moyens de créer des "sous-classes" de "classes" créées par le biais de l'héritage par prototype. On dirait que vous êtes en train de faire cela de manière assez manuellement, de sorte qu'il peut vous faire économiser quelques ennuis.
Vous avez tout à fait raison, bien sûr, JavaScript n'a pas de classes. Il est orienté objet et qu'il ne l'héritage.
Je ne suis pas le faire prototypes héritage. C'est un imbriquée/intérieur de la classe. Il n'y a pas d'héritage dans cet exemple. @Vidas - anon fn est juste pour la détermination de la portée de l'aide dans mon module de code. Elle n'ajoute rien à l'exemple. @Tomalak - on dirait que vous avez des décrochements sur ce que je fais avec mon code. Hmmm. Jamais penser voir un thérapeute?
des abominations comme ça? developer.mozilla.org/en-US/docs/Web/JavaScript/...

OriginalL'auteur Cheeso | 2011-01-22