Наследование Javascript — this.element не определено в подклассе

#javascript #jquery #inheritance

#javascript #jquery #наследование

Вопрос:

Я пытаюсь настроить родительский класс, который расширяет подкласс, но всякий раз, когда я пытаюсь ссылаться на this.element в подклассе при вызове из суперкласса, он не определен. Что я здесь делаю не так?

 $.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // this.element is undefined
  

Комментарии:

1. Вероятно, из-за того, что jQuery где-то делает черную магию.

Ответ №1:

Когда вы расширяете $.ui.testSub , он не существует в этой точке. Все, что вам нужно сделать, это поменять местами эти два блока кода:

 //Should be first
$.widget("ui.testSub", $.ui.mouse,
{
    _init: function ()
    {
        this.element.addClass("some-class");
    },
...
});

$.widget("ui.testSuper", $.extend({}, $.ui.testSub.prototype, 
{
    _init: function ()
    {
        $.ui.testSub.prototype._init();
    },
...
}));

$('#some-element').testSub({ }); // this works fine

$('#some-element').testSuper({ }); // then it will work fine as well
  

Смотрите живой пример здесь

Обновить

Я понял, что ты говоришь. Вам нужно вызвать базовый метод следующим образом

 $.ui.testSub.prototype._init.call(this);
  

Таким образом, вы не потеряете контекст своего элемента. Пример здесь

Комментарии:

1. Действительный момент в упорядочении, я не учел это, когда я опубликовал вопрос. Но основная проблема остается — вы можете увидеть это, если вы действительно добавите элемент, на котором я пытаюсь вызвать виджет. jsfiddle.net/46D8T/12

Ответ №2:

Я не уверен, что использование $.extend — это правильный путь.

Вот как я обычно расширяю виджеты пользовательского интерфейса jQuery:

 $.widget('ui.testSuper', $.ui.testSub {
    _create: function() {
        $.ui.testSub.prototype._create.call(this);
    }
});
  

Я вижу, что вы используете _init, поэтому, должно быть, используете более старую версию пользовательского интерфейса jQuery.