Шаблон JavaScript для нескольких конструкторов
Мне нужны разные конструкторы для моих экземпляров. Каков общий шаблон для этого?
8 ответов:
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, не так много.
Как вы находите это?
function Foobar(foobar) { this.foobar = foobar; } Foobar.prototype = { foobar: null }; Foobar.fromComponents = function(foo, bar) { var foobar = foo + bar; return new this(foobar); };
не хочется делать это вручную, как в ответ bobince, поэтому я просто полностью сорвали параметры шаблона плагин в jQuery.
вот конструктор:
//default constructor for Preset 'class' function Preset(params) { var properties = $.extend({ //these are the defaults id: null, name: null, inItems: [], outItems: [], }, params); console.log('Preset instantiated'); this.id = properties.id; this.name = properties.name; this.inItems = properties.inItems; this.outItems = properties.outItems; }
вот различные способы создания экземпляра:
presetNoParams = new Preset(); presetEmptyParams = new Preset({}); presetSomeParams = new Preset({id: 666, inItems:['item_1', 'item_2']}); presetAllParams = new Preset({id: 666, name: 'SOpreset', inItems: ['item_1', 'item_2'], outItems: ['item_3', 'item_4']});
и вот что сделал:
presetNoParams Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]} presetEmptyParams Preset {id: null, name: null, inItems: Array[0], outItems: Array[0]} presetSomeParams Preset {id: 666, name: null, inItems: Array[2], outItems: Array[0]} presetAllParams Preset {id: 666, name: "SOpreset", inItems: Array[2], outItems: Array[2]}
идя дальше с ответом eruciform, вы можете приковать свой
new
вызовinit
метод.function Foo () { this.bar = 'baz'; } Foo.prototype.init_1 = function (bar) { this.bar = bar; return this; }; Foo.prototype.init_2 = function (baz) { this.bar = 'something to do with '+baz; return this; }; var a = new Foo().init_1('constructor 1'); var b = new Foo().init_2('constructor 2');
иногда, значения по умолчанию параметров достаточно для нескольких конструкторов. И когда этого недостаточно, я пытаюсь обернуть большую часть функциональности конструктора в функцию init(other-params), которая вызывается впоследствии. Также рассмотрите возможность использования концепции фабрики для создания объекта, который может эффективно создавать другие объекты, которые вы хотите.
http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript
Это пример, приведенный для нескольких конструкторов в программирование в HTML5 с JavaScript и CSS3-Exam Ref.
function Book() { //just creates an empty book. } function Book(title, length, author) { this.title = title; this.Length = length; this.author = author; } Book.prototype = { ISBN: "", Length: -1, genre: "", covering: "", author: "", currentPage: 0, title: "", flipTo: function FlipToAPage(pNum) { this.currentPage = pNum; }, turnPageForward: function turnForward() { this.flipTo(this.currentPage++); }, turnPageBackward: function turnBackward() { this.flipTo(this.currentPage--); } }; var books = new Array(new Book(), new Book("First Edition", 350, "Random"));
Так что да, как было сказано ранее, несколько решений, то, что вы видите в целом в таких вещах, как дата, - это статические методы:
Date.UTC("some params");
Это не правильный конструктор, хотя, это хотя
function someObject(a,b,c,d,e,f) { a = a || "default"; b = b || "defaultb" }
может пойти typescript или транспилировать его в es5?
constructor(a:string, b = "default value", c:number? //optional ) { }
Я разработчик java, который решает мою проблему в javascripts со статическим методом
class MyClass { constructor(a,b,c,d){ this.a = a this.b = b this.c = c this.d = d } static BAndCInstance(b,c){ return new MyClass(null,b,c) } static BAndDInstance(b,d){ return new MyClass(null,b, null,d) } } //new Instance just with a and other is nul this can //use for other params that are first in constructor const myclass=new MyClass(a) //a Instance that has b and c params const BAndC=MyClass.BAndCInstance(b,c) //another example for b and d const BAndD=MyClass.BAndDInstance(b,d)
С помощью этого шаблона вы можете создать мульти конструктор