通过重载构造函数让它根据传入参数的不同来执行不同的初始化方法。如Set构造函数
function Set(){
this.values= {};
this.n = 0;
if(arguments.length==1 && isArrayLike(arguments[0])){
this.add.apply(this,arguments[0]);
}else if(arguments.length>0){
this.add.apply(this,arguments);
}
}
这段代码所定义的Set构造函数可以显式将一组元素作为参数列表传入,也可以传入元素组成的数组。但是函数函数有多义性,如果集合的某个成员是一个数组就无法通过这个构造函数来创建集合啦。
下面这个工厂方法用来通过数组初始化Set对象:
Set.fromArray= function(a){
s =new Set();
s.add.apply(s,a);
return s;
}
可以给工厂方法定义任意的名字,不同名字的工厂方法用以执行不同的初始化,但由于构造函数是类的公有标识,因此每个类只能有一个构造函数。但这并不是一个“必须遵守”的规则。
在JS中是可以定义多个构造函数继承自一个原型对象的,如果这样做的话,由这些构造函数的任意一个所创建的对象都属于同一类型。不推荐这样使用,但下例代码使用这种技术定义了该类的一个辅助构造函数:
function SetFromArray(a){
Set.apply(this,a);
}
SetFromArray.prototype =Set.prototype;
var s = new SetFromArray([1,2,3]);
s instanceof Set ; //=>true