Источник: http://learn.javascript.ru/inheritance-intro
Причина, по которой возникают такие вопросы, очень проста. На начальном этапе разработки наследование действительно не нужно. Ведь наследование — это способ расширения существующего функционала. А если интерфейс состоит из трёх кнопок и одного меню — там нечего расширять.
С другой стороны, пусть у нас есть меню Menu, с простыми методами close()
, open()
и событием select
.
Проект растет. Через некоторое время может понадобиться создать расширенный вариант меню, например с анимацией при открытии. А в другом месте проекта будет нужно, чтобы меню загружало своё содержимое с сервера при открытии… В третьем месте — еще что-то.
Конечно, можно учитывать возрастающие требования и добавлять возможности в функцию-конструктор Menu, но чем дальше, тем более громоздким объект будет становиться, тем сложнее будет продолжать работу с ним, просто потому что возможностей масса, и все они в одном месте.
Если такое меню является частью библиотеки, то разработчик много раз подумает, прежде чем тащить в проект супер-универсальный комбайн с 50 методами, из которых ему нужны только 3. К тому же, работу с универсальным меню очень сложно осваивать, ведь много возможностей — это много документации. Поэтому и было придумано наследование.
При помощи наследования, описываются объекты, наследующие от меню и модифицирующие его поведение. Там, где нужна модификация — используется наследник, там где нет — обычное меню.
Второй наиболее частый способ применения наследования — вынос базового функционала «за скобки», в общий родительский класс. Он применяется, в частности, для создания новых компонент.
Например, мы сделали в проекте меню Menu
, дерево Tree
, вкладки Tabs
… И замечаем, что во всех них используются общие методы для работы с документом, элементами.
Наследование позволяет нам вынести эти методы в «базовый компонент» Widget
, так что Menu
, Tree
и другие компоненты расширяют его и получают их сразу.