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.
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
Vous devez vous connecter pour publier un commentaire.
Il serait probablement vous aider si vous en finir avec la notion de "type", "classe", etc. lorsque vous traitez avec javascript. En javascript, il n'y a pas de différenciation de "type", "classe", "fonction", "instance", ou "objet" - il est "objet" tout le chemin vers le bas.
Puisque chaque "type" est un "objet" et est mutable, vous n'obtenez rien de la sorte de fort typée gains d'efficacité, vous pouvez obtenir à partir de Java ou C++ en réutilisant une seule définition de type. Penser à l'opérateur "new" en javascript comme quelque chose comme "clone de la définition et de l'appeler le constructeur", après quoi la définition de l'instance peut encore être modifié.
Alors, allez avec votre premier exemple de travail: vous n'aurez pas de gains en faisant quelque chose de différent.
OriginalL'auteur user85461
C'est ce que j'ai trouvé après de nombreuses heures d'ouverture:
De cette façon, vous pouvez instancier les Parents comme beaucoup que vous le souhaitez, avec leur Enfant
en dessous, et chaque Enfant instance d'avoir accès à ses parents de l'instance
par le biais de la variable parent.
OriginalL'auteur htatche
La seule façon que je peux penser à est de passer dans l'objet parent de l'Enfant du constructeur:
Et de l'instancier avec:
Ma justification est qu'il fait plus de sens que le
Child
constructeur est "statique" de la propriété deMyType2
, au lieu de l'objet instanciéx
dans votre exemple, puisque nous parlons de types ici, qui sont les mêmes dans toutes les instances deMyType2
.OriginalL'auteur David Tang
Je n'ai pas testé, mais vous devriez être capable d'utiliser JSON pour cela:
Maintenant, il peut y avoir beaucoup de problèmes avec cela, fonctionnelle ou stylistiques. Mais il est une alternative de l'autre des approches posté ici.
OriginalL'auteur Max Zlotskiy