我的实例需要其他构造函数。常见的模式是什么?
function ({ oneThing = 7, otherThing = defaultValue } = {}) { }
。= {}
我输入的额外内容是我最近学到的另一个技巧,以防万一您希望用户根本不传入任何对象并使用所有默认值。
return new this();
,return new this.otherStaticFactoryFunction();
,等)!
我的实例需要其他构造函数。常见的模式是什么?
function ({ oneThing = 7, otherThing = defaultValue } = {}) { }
。= {}
我输入的额外内容是我最近学到的另一个技巧,以防万一您希望用户根本不传入任何对象并使用所有默认值。
return new this();
,return new this.otherStaticFactoryFunction();
,等)!
Answers:
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,不是很多。
MyObj({foo: "foo"})
plus)也很有用MyObj({bar: "bar"})
。MyObj有两个构造函数-但都带有一个参数,它是一个字符串:-)
您如何找到这个?
function Foobar(foobar) {
this.foobar = foobar;
}
Foobar.prototype = {
foobar: null
};
Foobar.fromComponents = function(foo, bar) {
var foobar = foo + bar;
return new this(foobar);
};
您可以将类与返回该类实例的静态方法一起使用
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)
//an Instance that has b and c params
const instanceWithBAndC = MyClass.BAndCInstance(b,c)
//another example for b and d
const instanceWithBAndD = MyClass.BAndDInstance(b,d)
使用这种模式,您可以创建多个构造函数
感觉不像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');
new Foo()
和调用链接init
在一起。我不得不跑步var a = new Foo(); a.init_1('constructor 1');
有时,参数的默认值足以满足多个构造函数的需要。并且当这还不够时,我尝试将大多数构造函数包装到随后调用的init(other-params)函数中。还可以考虑使用工厂概念来制作可以有效创建所需其他对象的对象。
http://en.wikipedia.org/w/index.php?title=Factory_method_pattern&oldid=363482142#Javascript
回答是因为此问题首先在google中返回,但答案现在已过时。
您可以在ES6中将Destructuring对象用作构造函数参数
这是模式:
您不能有多个构造函数,但是可以使用解构和默认值来执行所需的操作。
export class myClass {
constructor({ myArray = [1, 2, 3], myString = 'Hello World' }) {
// ..
}
}
如果要支持“无参数”构造函数,则可以执行此操作。
export class myClass {
constructor({myArray = [1, 2, 3], myString = 'Hello World'} = {}) {
// ..
}
}
export default class Order {
static fromCart(cart) {
var newOrder = new Order();
newOrder.items = cart.items;
newOrder.sum = cart.sum;
return newOrder;
}
static fromOrder(id, order) {
var newOrder = new Order();
newOrder.id = id;
newOrder.items = order.items;
newOrder.sum = order.sum;
return newOrder;
}
}
用途:
var newOrder = Order.fromCart(cart)
var newOrder = Order.fromOrder(id, oldOrder)
这是使用JavaScript和CSS3-Exam Ref在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"));