Мне нужны некоторые простые объекты, которые могут стать более сложными позже, со множеством разных свойств, поэтому я подумал о шаблоне декоратора. Я сделал это, глядя на Крокфорд в конструкторе мощности и объекта увеличения:Является ли это хорошим шаблоном декоратора для javascript?
//add property to object
Object.prototype.addProperty = function(name, func){
for(propertyName in this){
if(propertyName == name){
throw new Error(propertyName + " is already defined");
}
}
this[name] = func;
};
//constructor of base object
var BasicConstructor = function(param){
var _privateVar = param;
return{
getPrivateVar: function(){
return _privateVar;
}
};
};
//a simple decorator, adds one private attribute and one privileged method
var simpleDecorator = function(obj, param){
var _privateVar = param;
var privilegedMethod1 = function(){
return "privateVar of decorator is: " + _privateVar;
};
obj.addProperty("privilegedMethod1", privilegedMethod1);
return obj;
}
//a more complex decorator, adds public and private properties
var complexDecorator = function(obj, param1, param2){
//private properties
var _privateVar = param1;
var _privateMethod = function(x){
for(var i=0; i<x; i++){
_privateVar += x;
}
return _privateVar;
};
//public properties
var publicVar = "I'm public";
obj.addProperty("publicVar", publicVar);
var privilegedMethod2 = function(){
return _privateMethod(param2);
};
obj.addProperty("privilegedMethod2", privilegedMethod2);
var publicMethod = function(){
var temp = this.privilegedMethod2();
return "do something: " + temp + " - publicVar is: " + this.publicVar;
};
obj.addProperty("publicMethod", publicMethod);
return obj;
}
//new basic object
var myObj = new BasicConstructor("obj1");
//the basic object will be decorated
var myObj = simpleDecorator(obj, "aParam");
//the basic object will be decorated with other properties
var myObj = complexDecorator(obj, 2, 3);
Это хороший способ иметь декоратор в JavaScript? Есть ли еще лучшие способы сделать это?
Этот способ программирования кажется довольно непригодным для меня и запутанным, но, возможно, я единственный ... – Harmen
Есть ли какая-то причина использовать этот шаблон, отличный от «эти объекты могут быть более сложными в какой-то момент в будущем «? – Mathew
Эти объекты * являются более сложными в некоторой точке * сейчас *. Поэтому, если мне нужны некоторые объекты, которые должны быть простыми и другими объектами, которые должны быть более сложными, я не хочу создавать множество разных объектов, я увеличу сложность любого отдельного объекта, используя некоторые определенные свойства. Подумайте о пользовательских интерфейсах, если вы создаете другой объект для каждой комбинации элементов интерфейса, у вас есть комбинационный взрыв. Здесь этот шаблон может помочь вам лучше разработать код. –