Я только что закончил книгу Дуга Крокфорда Хорошие стороны, и он предлагает три разных способа наследования: эмуляция классической модели, наследования на основе прототипов и функционального наследования.
В последнем он создает функцию, своего рода фабрику, которая выдает объекты, дополненные желаемыми методами, основанными на других объектах; что-то вроде:
var dog = function(params) {
// animal is the 'super class' created
// the same way as the dog, and defines some
// common methods
var that = animal(params);
that.sound = 'bark';
that.name = function () {};
return that;
}
Поскольку все объекты, созданные таким образом, будут иметь ссылку на одни и те же функции, объем памяти будет намного меньше, чем при использовании, например, оператора new
. Вопрос в том, даст ли подход прототипа какие-либо преимущества в этом случае? Другими словами, являются ли прототипы объектов каким-то образом «ближе к металлу», обеспечивающему преимущества в производительности, или это просто удобный механизм?
РЕДАКТИРОВАТЬ: я упрощу вопрос. Прототипы против их эмуляции через композицию объектов. Пока вы не требуете, чтобы все экземпляры объектов обновлялись новыми методами, что является удобством, предлагаемым только прототипами, есть ли вообще какие-либо преимущества в использовании прототипов?
Я написал Дугу Крокфорду по электронной почте, и он сказал следующее:
[Использование функционального подхода выше по сравнению с прототипами] не так уж много памяти. Если у вас есть огромное количество объектов, умноженное на огромное количество методов, вам может понадобиться прототип. Но воспоминаний в наши дни предостаточно, и только экстремальное приложение заметит это.
Прототипы могут использовать меньше памяти, но могут немного медленнее извлекать данные, особенно если цепочки очень длинные. Но в целом это не заметно.