Подкласс Prototypejs не наследует атрибуты суперкласса - PullRequest
1 голос
/ 27 августа 2011

Я создал суперкласс Control и подкласс LED. Инициализатор Control устанавливает несколько атрибутов, таких как высота, ширина и тому подобное. Однако, когда я создаю экземпляр LED - с надлежащими данными для заполнения атрибутов, которые он должен наследовать - унаследованные атрибуты не отображаются при регистрации экземпляра.

Вот два конструктора:

var Control = Class.create({
    initialize: function(control){
        log('info','Beginning creation of control using following control object.');
        log('log',control);

        // Define self to prevent conflicts with frameworks
        if(!self){ var self = this; }

        this.type = null;
        this.size = { w: control.w, h: control.h };
        this.position = { x: control.x, y: control.y };
        this.color = control.color;
        this.name = control.name;
        this.active = false;
    }
});

var LED = Class.create(Control,{
    initialize: function($super){
        $super;
        this.type = "led";
    }
});

Я создал небольшой сайт Heroku для демонстрации: http://blazing -dusk-603.heroku.com / interfaces / 16 , если вы откроете консоль, вы увидите тонну логов, один внизу - это экземпляр светодиода без размера, положения, цвета, имени или активного атрибута.

Это первый раз, когда я использую prototypejs для наследования, так что, возможно, я что-то неправильно понял, помощь, конечно, была бы признательна;)

1 Ответ

1 голос
/ 27 августа 2011

Если вы хотите вызвать метод суперкласса, вам, вероятно, следует сделать это:

  $super.call(this, this); // not exactly sure what "$super" is supposed to be
  $super.initialize(this); // maybe?

(или что-то в этом роде).В любом случае простое упоминание переменной, как это делает ваш код, не даст никакого эффекта.

edit - в соответствии с документами Prototype, $ super является ссылкой на функцию родительского классатак что если вы хотите вызвать его, вам нужно будет передать параметр «control».Я не знаю, что это должно быть, но ваш базовый класс "initialize ()" явно хочет, чтобы он был чем-то ненулевым.

Действительно, мне кажется, что ваш подкласс "initialize ()"на самом деле не следует шаблону API родительского класса:

var LED = Class.create(Control, {
  initialize: function($super, control) {
    $super.call(this, control);

кажется, что он ближе к тому, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...