В Javascript я хотел бы определить класс с внутренним (или вложенным) классом.Во внутреннем классе я хотел бы иметь возможность получить доступ к родительскому экземпляру.Как я могу сделать это эффективно?
Какой-то код покажет, что я имею в виду.Предположим, я определил класс MyType1, который предоставляет несколько свойств и одну функцию, SayHello
:
(function(){
MyType1 = function(name){
this.TypeName = "MyType1";
this.Name = name;
};
MyType1.prototype.SayHello = function() {
say(this.Name + " says hello...");
};
})();
Хорошо, теперь, начиная с этого момента, я хочу добавить «внутренний класс» в MyType1, поэтомуЯ добавляю новый код, чтобы он выглядел так:
(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...");
};
})();
Теперь я могу использовать эти классы так:
var x = new MyType1("Victor");
x.SayHello();
var c = new x.Child("Elizabeth");
c.Introduce();
, все работает.Но он определяет новую дочернюю функцию (или тип , если хотите) для каждого экземпляра MyType1.Я хотел бы получить доступ к области родительского класса, не прибегая к этой неэффективности.Примерно так:
(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;
})();
Но это не работает.Разумеется, parentName
var находится вне области видимости.
Существует ли эффективный способ для экземпляра Child (в конструкторе или в любой функции класса) получить доступ к родительскому экземпляру (MyType2)?
Я знаю, что мог бы определить класс Child как независимый, не вложенный класс, а затем в ctor просто передать экземпляр Parent.Но это создает N ссылок на родительский экземпляр, по одной на каждый экземпляр Child.Это кажется неэффективностью, которую я хотел бы избежать.
спасибо за любые советы.
EDIT - причина, по которой я хочу, чтобы Child имел доступ к родительскому экземпляру, состоит в том, что родительский объект содержит объект, которыйсоздать довольно дорого - что-то вроде подключения к базе данных - и я бы хотел, чтобы ребенок мог использовать эту вещь.