Используя «простое наследование JavaScript» Джона Резига, как я могу вызвать супер метод ПЛЮС дополнительный код из метода? - PullRequest
1 голос
/ 05 февраля 2012

Я решил попробовать «простое наследование JavaScript» гения Джона Резига, как подробно описано на этой странице блога:

http://ejohn.org/blog/simple-javascript-inheritance/

Мне интересно, как можно переопределить метод с помощьюкод, который вызывает супер метод.Другими словами, допустим, я начинаю с Person class:

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;
    }
});

Как только метод extension , вызванный из Person для создания Worker , видит класс *this._super (аргументы) * заменяет работника init на Person's init , оставляя меня с неопределенной профессией property.

У кого-нибудь есть какие-либо предложения относительно того, как обойти это без изменения кода мистера Ресига?В настоящее время я пробую разные способы реализации концепции «супер», но тот факт, что я не могу заставить это работать с существующим кодом, застрял в моей голове.: -)

ОБНОВЛЕНИЕ: я понял, что допустил одну маленькую ошибку при реализации кода мистера Ресига, поэтому он вел себя так, как я описал.@chuckj правильно указал на ошибку в Worker's init тоже.

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Измените определение работника на

var Worker = Person.extend({ 
    init: function (name, age, occupation) { 
        this._super(name, age); 
        this.occupation = occupation; 
    } 
}); 

вы не передаете массив arguments, вы вызываете _super с ожидаемыми параметрами.

0 голосов
/ 30 января 2013

Похоже, ваша цель - прокси от arguments до this._superВ этом случае вы можете просто apply() их:

var Worker = Person.extend({
    init: function ( name, age, occupation ) {
        this._super.apply(this, arguments);
        this.occupation = occupation;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...