适用于多个构造函数的JavaScript模式

我需要不同的构造函数为我的实例。 这是什么常见的模式?

JavaScript没有函数重载,包括方法或构造函数。

如果你想要一个函数的行为有所不同,取决于你传递给它的参数的数量和types,你必须手动嗅探它们。 JavaScript会高兴地调用一个函数,声明的参数数量多于或less于这个数量。

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,不是那么多。

你怎么find这个?

 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)函数中。 另外考虑使用工厂的概念,使一个对象,可以有效地创build你想要的其他对象。

http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript

这是使用JavaScript和CSS3编写HTML5中的多个构造函数的例子- 考试参考

 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")); 

所以,如前所述,多种解决scheme,你在日常事务中看到的一般是静态方法:

 Date.UTC("some params"); 

这不是一个适当的构造函数,但这是

 function someObject(a,b,c,d,e,f) { a = a || "default"; b = b || "defaultb" } 

可以去打字或者把它转换成es5吗?

 constructor(a:string, b = "default value", c:number? //optional ) { }