Наследование в JavaScript

05-04-2020

Есть, конечно, железный вариант

function inherit2(subClass, superClass) { subClass.prototype = new superClass(); subClass.prototype.constructor = subClass; } // define classes var MyClass = function() {this._myField = '_myField';}; var Subclass = function() {/*constructor body*/}; // inherit Subclass from MyClass inherit2(Subclass, MyClass); // create Subclass instance var instance = new Subclass();

При таком подходе наследование соблюдается: instance instanceof MyClass === true. Но есть недостаток: в прототипе Subclass'а окажется ненужный член - _myField

Сегодня (о, это знаменательный день 3 апреля 2011 года!) я прочитал вышеупомянутую статью на хабре и прозрел. Я познал ДАО наследования в JavaScript. Ниже вашему вниманию приводится небольшой кусочек кода, где определяются два пользовательских класса, второй наследуется от первого. Затем создается экземпляр второго класса и проверяется его принадлежность к первому классу!

// define classes var MyClass = function() {/*constructor body*/}; var Subclass = function() {/*constructor body*/}; // inherit Subclass from MyClass Subclass.prototype.__proto__ = MyClass.prototype; // create Subclass instance var instance = new Subclass();

, только это не работает в IE и Opera. Не работает потому, что в них нет свойства __proto__, вместо этого в них используется неуловимое ], которое нельзя явно проставить. В итоге я разработал кроссбраузерный способ для организации наследования. Здесь после создания экземпляра суперкласса tmpInstance мы проходимся по всем его свойствам и удаляем их. Это нужно для того чтобы получить объект с одним лишь свойством - ]. Можно этот цикл совсем убрать, если в конструкторе не будет модифицироваться объект (this.propery = ..). Поэтому я рекомендую делать конструктор пустым, а для инициализации использовать специальный метод init. Получим что-то вроде Java Beans, где у класса должен быть public конструктор без параметров. Но все же в прикладных системах нельзя полагаться, что все люди будут жестко следовать этой конвенции (пустой конструктор), поэтому я все же оставляю в реализации метода inherit чистку объекта tmpInstance.

Но если вы архитектор в своей системе и можете жестко закрепить правило пустой конструктор, то лучше для своих компонентов написать простенькую функцию createClass, принимающую на вход родительский класс, а возвращающую дочерний. Вот возможный вариант реализации:

function createClass(superClass) { var subClass = function() {}; subClass.prototype = new superClass(); return subClass; }

Наконец, апогей всех рассуждений про наследование - следующая диаграмма. Здесь сделан акцент на важности свойство __proto__.

12

Смотрите также:
 Добавление обработчиков событий
 Интересные истории про восстановление данных
 Так ли много денег в буржуйнете?
 WebMoney
 Mandarin ICQ

Добавить комментарий:
Введите ваше имя:

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

Защита от спама - решите пример:


Онлайн-игры для социальных сетей:

Понравились обзоры? Читайте еще!

Новые обсуждения на форуме:

Парк аттракционов "Сегодня парки отдыха практически повсеместно вытесняются тематическими парками, хотя обычно эти два определения смешивают.."
Зачем надо учиться играть в шахматы? "Шахматы долгое время считались игрой королей и аристократов.."