Я уже пару лет размышлял над тем, что люди думают о наследовании с помощью шаблона конструктора шаблона-шаблона и БЕЗ обычного прототипного наследования. Почему программисты не используют шаблон модуля для не-одиночных js-классов? Для меня преимущества следующие:
- Очень понятный публичный и закрытый охват (легко понять код и api)
- Не нужно отслеживать указатель 'this' через $.proxy(fn, this) в обратных вызовах
- Больше нет var = this и т.д. с обработчиками событий и т.д. Всякий раз, когда я вижу 'this', я знаю, что это контекст, который передается в обратный вызов, это НЕ то, что я отслеживаю, чтобы узнать свой объект экземпляр.
Недостатки:
- Малая деградация
- Возможна ли опасность "визга пальца" у Дуга Крокфорда?
Рассмотрим это (просто запустите в любой консоли js)
var Animal = function () {
var publicApi = {
Name: 'Generic',
IsAnimal: true,
AnimalHello: animalHello,
GetHelloCount:getHelloCount
};
var helloCount = 0;
function animalHello() {
helloCount++;
console.log(publicApi.Name + ' says hello (animalHello)');
}
function getHelloCount(callback) {
callback.call(helloCount);
}
return publicApi;
};
var Sheep = function (name) {
var publicApi = {
Name: name || 'Woolie',
IsSheep: true,
SheepHello: sheepHello
};
function sheepHello() {
publicApi.AnimalHello();
publicApi.GetHelloCount(function() {
console.log('i (' + publicApi.Name + ') have said hello ' + this + ' times (sheepHello anon callback)');
});
}
publicApi = $.extend(new Animal(), publicApi);
return publicApi;
};
var sheepie = new Sheep('Sheepie');
var lambie = new Sheep('Lambie');
sheepie.AnimalHello();
sheepie.SheepHello();
lambie.SheepHello();
Мой вопрос в том, каковы недостатки такого подхода, которые я не вижу? Это хороший подход?
Спасибо!
[обновление]
Спасибо за отличные ответы. Хотел бы я дать всем щедрость. Это то, что я искал. В основном, что я думал. Я бы никогда не использовал шаблон модуля для создания более чем нескольких экземпляров чего-то. Обычно только пара. Причина, по которой я думаю, имеет свои преимущества, - это то, что маленькая деградация перформанса, которую вы видите, отбирается в простоте опыта кодирования. У нас есть много кода для написания этих дней. Мы также должны повторно использовать код других людей, и лично я ценю, когда кто-то нашел время, чтобы создать красивый элегантный шаблон, а не догматически придерживаться прототипного наследования, когда это имеет смысл.