Мне нужны различные конструкторы для моих экземпляров. Что такое общий шаблон для этого?
Как вы его нашли?
function Foobar(foobar) {
this.foobar = foobar;
}
Foobar.prototype = {
foobar: null
};
Foobar.fromComponents = function(foo, bar) {
var foobar = foo + bar;
return new this(foobar);
};
В JavaScript нет перегрузки функций, в том числе для методов или конструкторов.
Если вы хотите, чтобы функция вела себя по-разному в зависимости от количества и типов параметров, которые вы ей передаете, вам придется перебирать их вручную. JavaScript с радостью вызовет функцию с большим или меньшим числом аргументов, чем объявлено.
function foo(a, b) {
if (b===undefined) // parameter was omitted in call
b= 'some default value';
if (typeof(a)==='string')
this._constructInSomeWay(a, b);
else if (a instanceof MyType)
this._constructInSomeOtherWay(a, b);
}
Вы также можете обратиться к arguments
как к массиву, чтобы получить любые другие переданные аргументы.
Если вам нужны более сложные аргументы, может быть хорошей идеей поместить некоторые или все из них в поиск объекта:
function bar(argmap) {
if ('optionalparam' in argmap)
this._constructInSomeWay(argmap.param, argmap.optionalparam);
...
}
bar({param: 1, optionalparam: 2})
Python демонстрирует, как аргументы по умолчанию и именованные аргументы могут быть использованы для покрытия большинства случаев использования более практичным и изящным способом, чем перегрузка функций. JavaScript - не очень.
Иногда значений по умолчанию для параметров достаточно для нескольких конструкторов. А когда этого недостаточно, я пытаюсь обернуть большую часть функциональности конструктора в функцию init (other-params), которая вызывается впоследствии. Также рассмотрите возможность использования концепции фабрики для создания объекта, который может эффективно создавать другие объекты, которые вы хотите.
http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript