Используя "простое наследование JavaScript" Джона Резига, как я могу вызвать супер метод ПЛЮС дополнительный код из метода?
Я решил попробовать "простое наследование JavaScript" гения Джона Резига, как подробно описано на этой странице блога:
http://ejohn.org/blog/simple-javascript-inheritance/
Мне любопытно, как можно переопределить метод кодом, который вызывает метод super. Другими словами, допустим, я начинаю с класса Person:
var Person = Class.extend({
init: function ( name, age ) {
this.name = name;
this.age = age;
}
});
Я расширяю этот класс Person для создания нового класса Worker:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this.name = name;
this.age = age;
this.occupation = occupation;
}
});
В двух версиях метода init есть повторение кода. Следующие две строки выполняются независимо от того, какой класс я использую:
this.name = name;
this.age = age;
Похоже, я должен быть в состоянии вызвать метод init класса Person из метода init класса Hero, а затем добавить дополнительную строку кода со свойством занятия.
Я не могу сделать это с помощью кода мистера Ресига. Следующее не работает:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this._super(arguments);
this.occupation = occupation;
}
});
Как только метод расширения, вызванный из Person для создания класса Worker, видит *this._super(arguments)*, он заменяет весь инициатор Worker на метод Person, оставляя меня с неопределенным свойством занятия.
Есть ли у кого-нибудь какие-либо предложения относительно того, как обойти это без изменения кода мистера Ресига? В настоящее время я пробую разные способы реализации концепции "супер", но тот факт, что я не могу заставить это работать с существующим кодом, застрял в моей голове.:-)
ОБНОВЛЕНИЕ: я понял, что сделал одну маленькую ошибку в реализации кода мистера Ресига, поэтому он вел себя так, как я описал. @chuckj также правильно указал на ошибку в инициализации Worker's.
2 ответа
Измените определение работника на,
var Worker = Person.extend({
init: function (name, age, occupation) {
this._super(name, age);
this.occupation = occupation;
}
});
ты не проходишь arguments
массив, вы называете _super
с параметрами, которые он ожидает.
Похоже, ваша цель - прокси arguments
в this._super
, В этом случае вы можете просто apply()
их:
var Worker = Person.extend({
init: function ( name, age, occupation ) {
this._super.apply(this, arguments);
this.occupation = occupation;
}
});