Я не совсем слежу за вашим кодом (вы ссылаетесь на функцию parentDisplay
, которая нигде не определена; вы имели в виду personDisplay
?), Но если вы хотите воспользоваться преимуществами прототипного наследования JavaScript, вы можете Не используйте любое свойство в this
для ссылки на родителя, потому что вы столкнетесь с проблемой grand-child: таким образом легко создать родительскую / дочернюю иерархию, но она потерпит неудачу, как только вы пытаетесь создать иерархию прародителя / родителя / ребенка. Это связано с тем, что экземпляр объекта всегда является дочерним, даже когда выполняется родительский код, и поэтому, если родительский код пытается использовать то же свойство для ссылки на его родительский код, он в конечном итоге обращается к самому себе. и повторяется до тех пор, пока не закончится стек.
Таким образом, вы используете что-то кроме свойства на this
. Мое решение состоит в том, чтобы использовать свойство на самих экземплярах функции и немного слесарного дела. При определении подкласса вы назначаете версию функции суперкласса свойству версии функции подкласса. Тогда код на всех уровнях может использовать это свойство для ссылки на родительскую версию функции.
Я подробно об этом расскажу в этом сообщении в блоге: Простые, эффективные суперколлы в JavaScript . Используя помощника, созданного в статье, вы можете сделать следующее:
var Parent = Helper.makeClass(function(){
function foo() {
return "P";
}
return {foo: foo};
});
var Child = Helper.makeClass(Parent, function(){
function foo() {
return foo.$super.call(this) + " < C";
}
return {foo: foo};
});
var GrandChild = Helper.makeClass(Child, function(){
function foo() {
return foo.$super.call(this) + " < GC";
}
return {foo: foo};
});
var gc = new GrandChild();
alert(gc.hierarchy()); // Alerts "P < C < GC"
(Мне больше не нравится называть их классами, они не являются классами, они являются функциями-конструкторами. Но в статье все еще есть имя makeClass
, так что ...)
Обратите внимание на удобные функции видимости, так что вы можете иметь служебные функции для ваших "классов", которые полностью скрыты от внешнего мира; и поэтому функции вашего экземпляра могут иметь собственные имена, , что хорошо .