Используя "простое наследование 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;
    }
});
Другие вопросы по тегам