В 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
выходит за рамки.
Есть ли эффективный способ для экземпляра Child (в конструкторе или в любой функции класса) получить доступ к родительскому экземпляру (MyType2)?
Я знаю, что могу определить класс Child как независимый, невложенный класс, а затем в ctor для этого просто передать экземпляр Parent. Но это создает N ссылок на родительский экземпляр, по одной на каждый дочерний экземпляр. Это похоже на неэффективность, которую я хотел бы избежать.
спасибо за любые советы.
EDIT - причина, по которой я хочу, чтобы дочерний элемент имел доступ к родительскому экземпляру, заключается в том, что родительский объект содержит объект, создание которого довольно дорого - что-то вроде соединения с базой данных - и я хотел бы, чтобы дочерний элемент чтобы иметь возможность использовать эту вещь.
var
для определения локальных переменных. Если вы хотите определить глобальные переменные (пожалуйста, не делайте этого), определите их явно как свойства глобальной области видимости. - person Pointy   schedule 22.01.2011