Я прохожу через учебник Адди Османи по шаблону Decorator (найдено здесь http://addyosmani.com/blog/decorator-pattern/), и я немного запутался в том, как реализовать самый упрощенный Decorator в Javascript. Кажется, что некоторые примеры используют шаблон obj.prototype для добавления функциональности к существующему объекту, а некоторые создают автономную функцию и передают объект.Javascript Decorator Pattern - прототип или единственная функция?
// Decorator Pattern ?
function coffee(size, flavors) {
this._size = size || "medium";
this._flavors = flavors || [];
this._cost = 100;
this.info = function() {
console.log(this._size, this._flavors, this._cost);
}
}
// Decorator - Would this be considered a decorator since the functionality needed to add flavors default to the coffee object?
function addFlavor(coffee, flavor) {
coffee._flavors.push(flavor);
coffee._cost = coffee._cost + 25;
}
// Decorator - Engrave the cup? lol
function engraving(coffee) {
coffee._cost = coffee._cost + 200;
}
// Decorator Variation w/ prototype instead - Add cream
coffee.prototype.addCream = function() {
this._cost = this._cost + 100;
};
// Instantiate Coffee
testCoffee = new coffee('Large', ['vanilla']);
// Add Flavors
addFlavor(testCoffee, 'chocolate');
addFlavor(testCoffee, 'almond');
addFlavor(testCoffee, 'hazelnut');
// Add Engraving
engraving(testCoffee);
// Add Cream
testCoffee.addCream();
// Log it all to the console
testCoffee.info();
JsFiddle этого примера можно найти здесь: http://jsfiddle.net/pathsofdesign/ocbbzoy2/
Мой вопрос (ы): Похоже, что я могу реализовать шаблон Decorator с помощью прототипичный наследования. Есть ли какие-либо плюсы или минусы для этого? (Т.е.: мой метод addCream())? Спасибо!
UPDATE:
Похоже, мой пример не на самом деле реализации шаблона Decorator на всех. И @Etai, и @Bergi дали отличные ответы ниже. Если я правильно понимаю, традиционный JS Decorator «обертывает» другой объект и затем корректирует поведение этого конкретного объекта без изменения базового объекта.
Что вы спрашиваете * точно? * –
@AlexWayne - Я обновил свой вопрос, извините, я был неясно. – Pathsofdesign