Javascript наследование использовать ранее переопределенную функцию - PullRequest
0 голосов
/ 30 марта 2011

Я пришел к выводу, что в javascript есть несколько способов сделать множественное наследование.Я не понимаю, как вызывать родительские функции.Я делаю это так

function person(name){
 this.name=name;
 this.display=function(){alert(this.name);}
 this.personDisplay=this.display; //pointer to parent function
}
function employee(name,ID){
 this.person=person;
 this.person(name);
 this.ID=ID;
 this.display=function(){this.parentDisplay();alert(this.ID);}
}

, но мне было интересно, есть ли правильный способ повторного использования родительских функций, таких как

function employee(name,ID){
 this.person=person;
 this.person(name);
 this.ID=ID;
 this.display=function(){parent.display();alert(this.ID);} //ideally what I want
}

Ответы [ 2 ]

1 голос
/ 30 марта 2011

Это не множественное наследование.Только одиночное наследование.

В JavaScript для имитации объектно-ориентированного программирования на основе классов вам необходимо использовать прототип .С технической точки зрения JavaScript является прототипным языком, а не объектно-ориентированным, но вы можете достаточно успешно имитировать классы в стиле ОО.

Использование прототипа обычно является "классическим" или "псевдоклассическим""style.

Или вы можете использовать" функциональный "стиль, популяризированный Дугласом Крокфордом (просто Google его).

У Майкла Болина есть хорошая статья , обсуждающая эти два стиля.

Большинство OO-реализаций в JavaScript являются вариантами этих двух стилей.

Вам настоятельно настоятельно рекомендуется принять библиотеку JavaScript, которая делает все это за вас.Моя личная рекомендация - Dojo Toolkit .

0 голосов
/ 30 марта 2011

Я не совсем слежу за вашим кодом (вы ссылаетесь на функцию 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, так что ...)

Обратите внимание на удобные функции видимости, так что вы можете иметь служебные функции для ваших "классов", которые полностью скрыты от внешнего мира; и поэтому функции вашего экземпляра могут иметь собственные имена, , что хорошо .

...