Я только что закончил работу Дуга Крокфорда The Good Parts , и он предлагает три различных способа наследования: эмуляция классической модели, наследование на основе прототипов и функциональное наследование.
В последнем он создает функцию, своего рода фабрику, которая выплевывает объекты, дополненные желаемыми методами, которые строятся на других объектах;что-то вроде:
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
.Вопрос в том, даст ли прототипный подход какие-либо преимущества в этом случае?Другими словами, являются ли объектные прототипы как-то «ближе к металлу», которые обеспечивают преимущества в производительности, или это просто механизм удобства?
РЕДАКТИРОВАТЬ: я упросту вопрос.Прототипы против их эмуляции через композицию объектов.До тех пор, пока вам не требуется, чтобы все экземпляры объектов обновлялись с помощью новых методов, что удобно только для прототипов, есть ли какие-либо преимущества в использовании прототипов?
Я написал Дугу Крокфорду по электронной почте, и он сказал следующее:
[Использование приведенного выше функционального подхода и прототипов] не так уж много памяти.Если у вас есть огромное количество объектов, умноженное на огромное количество методов, вы можете попробовать прототип.Но памяти в наши дни много, и только экстремальные приложения заметят это.
Прототипы могут использовать меньше памяти, но могут иметь немного более медленный поиск, особенно если цепочки очень длинные.Но, как правило, это не заметно.