Проблема дизайна наследования Javascript - PullRequest
0 голосов
/ 20 октября 2011

Следующий фрагмент показывает, как я создал свое наследство. Меня вдохновила эта статья.

function Base() {
    this.init();
}

Base.prototype.init = function () {
};

Derived1.prototype = new Base();
Derived1.prototype.constructor = Derived1;
Derived1.superclass = Base.prototype;

function Derived1() {    
}

Derived1.prototype.init = function() {
    Derived1.superclass.init.call(this);
};

Derived2.prototype = new Derived1();
Derived2.prototype.constructor = Derived2;
Derived2.superclass = Derived1.prototype;

function Derived2() {
    Derived2.superclass.init.call(this);
}

Когда этот js-файл загружается браузером, все конструкторы будут вызываться.

Derived2.prototype = new Derived1();

Это может привести к неожиданному поведению.

Есть ли способ остановить это поведение?

1 Ответ

0 голосов
/ 20 октября 2011

Имо, это плохая модель наследования.Что если родительская функция конструктора ожидает передачи параметров?

Прототип дочернего класса должен наследовать от прототипа родительского класса, а не его экземпляра.Несколько библиотек реализуют этот способ:

function inherit(Child, Parent) {
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
}

Используется как:

inherit(Derived1, Base);

Затем в функции конструктора дочернего элемента вы должны вызвать функцию конструктора родителей:

function Child() {
    Parent.call(this);
}

Конечно, вы также можете добавить свойство superclass, если хотите.

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