Сообщение от melky
|
Интересно, чем не устраивает обычный стиль - прототипное наследование?
|
А тут почти тоже самое (с точки зрения конечного результат тоже самое), просто к прототипу дочернего объекта примешивается прототип родительского. А удобно тем, что легко описывать древовидные свойства прототипа, например:
function parent() {}
parent.prototype.myProp = {
a: {b: {...}},
c: {...},
onEvents: {onInit, onRemove}
};
function child() {}
child.prototype.myProp = {
a: {b: 2},
c: [1, 2, 3],
onEvents: {onUpdate}
};
extend(parent, child);
При подмешивании прототипов происходит глубокое переопределение/дополнение свойств, и это крайне удобно, когда класс имеет такие свойства (можно бить функциональность по неймспейсам и создавать деревья стандартных настроек инстанса).
Пример из реальной жизни: когда работал над новой реализацией отчётов для Яндекс.Метрики, то для графиков использовал библиотеку Hightcharts. У неё очень гибкая и глубокая древовидная система настроек, а многие отчёты могут отличаться на n-м уровне настроек, при этом каждый отчёт является классом, т.к. мы можем захотеть создать инстанс например для виджета на дашборд или внешнего виджета. Получается, что у класса отчёта в прототипе прописаны настройки для Hightcharts и дочерний класс просто переопределяет или дополняет любой уровень настроек.
Из плюсов такого подхода: значительно более гибкая система наследования.
В плане затраты ресурсов и скорости работы они одинаковы, т.к. конечный код с точки зрения интерпретатора JS один и тот же, т.е. это просто сахар.