W JavaScript, chciałbym zdefiniować klasę z klasą wewnętrzną (lub zagnieżdżoną). W ramach wewnętrznej klasy chciałbym móc uzyskać dostęp do instancji nadrzędnej. Jak mogę to zrobić wydajnie?JavaScript, wewnętrzne klasy i jak skutecznie uzyskać dostęp do zakresu nadrzędnego
Niektóre kod pokaże co mam na myśli. Załóżmy, że zdefiniowanie klasy, MyType1, która odsłania kilka właściwości i jedną funkcję, SayHello
:
(function(){
MyType1 = function(name){
this.TypeName = "MyType1";
this.Name = name;
};
MyType1.prototype.SayHello = function() {
say(this.Name + " says hello...");
};
})();
Ok, teraz, wychodząc stamtąd, chcę dodać „wewnętrzną klasę” do MyType1, więc dodam kilka nowych kod tak, że wygląda tak:
(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...");
};
})();
teraz mogę korzystać z tych klas tak:
var x = new MyType1("Victor");
x.SayHello();
var c = new x.Child("Elizabeth");
c.Introduce();
, że wszystko działa. Ale definiuje nową funkcję Child (lub typu, jeśli chcesz) dla każdego wystąpienia MyType1. Chciałbym uzyskać dostęp do zakresu klasy nadrzędnej, bez uciekania się do tej nieefektywności. coś takiego:
(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;
})();
Ale to nie działa. Zmienna parentName
jest poza zakresem, oczywiście.
Czy istnieje skuteczny sposób dla instancji Child (w konstruktorze lub w dowolnej klasie), aby uzyskać dostęp do instancji nadrzędnej (MyType2)?
wiem, że mogę określić klasę dziecka do bycia niezależnym, nie zagnieżdżone klasy, to w ctor za to, po prostu przekazać instancji nadrzędnej. Ale tworzy N odwołań do instancji nadrzędnej, jednej dla każdej instancji podrzędnej. To wydaje się być nieskutecznością, której chciałbym uniknąć.
dzięki za wszelkie wskazówki.
EDIT - powodem chcę dziecko miało dostęp do instancji nadrzędnej, jest to, że dominująca posiada obiekt, który jest dość drogie, aby utworzyć - coś w rodzaju połączenia db - i chciałbym dziecko, aby móc to wykorzystać.
Ugh, jeszcze więcej nadużywania Javascriptu do wprowadzenia nonsensów "OOP". Ten język nie ma klas: jeśli chcesz, użyj czegoś, co robi! –
Może się to okazać przydatne: http://blog.niftysnippets.org/2009/09/simple-efficient-supercalls-in.html Jest to zestaw funkcji pomocniczych (i ich wyjaśnienie), które zapewniają proste, ale wydajne, tworzenia "podklas" "klas" utworzonych przez prototypowe dziedziczenie. Wygląda na to, że robisz to dość ręcznie, więc może cię to uratować. –
@Tomalek: Masz całkowitą rację, oczywiście JavaScript nie ma klas. Jest zorientowany obiektowo i ma dziedziczenie. –