适用于多个构造函数的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 ) { }