寫在前面
有時候我們希望物件的初始化有多種方式。例如透過元素組成的陣列來初始化一個Set對象,而不是透過傳入構造函數的參數列表來初始化它
重載overload
透過重載這個建構函式方法讓它根據傳入參數的不同,來執行不同的初始化方法。
function Set() {
this.values = {}; // 用這個物件的屬性來保存這個集合
this.n = 0; // 集合中值的個數
// 如果傳入一個類別數組的對象,將這個元素加入集合
// 否則,將所有的參數加入集合
if(arguments.length === 1 && isArrayLike(arguments[0])) {
this.add.apply (this, arguments[0]); //把物件利用apply()加到集合中
}else if(arguments.length > 0) {
this.add.apply(this, arguments); / / 利用add()方法將所有參數加入集合
}
}
這段程式碼所定義的Set()建構子可以明確地將一組元素當作參數清單傳入,也可以傳入元素組成的陣列。但這個建構函式有多義性,如果集合的某個參數是一個陣列就將無法透過這個建構函式來建立這個集合了(為了做到這一點,需要先建立一個空集合,然後顯示呼叫add()方法)。
工廠方法
一個類別的方法用來傳回類別的一個實例。
// 工廠方法以陣列初始化SetSets
// 工廠方法透過陣列初始化SetSets
Set.fromArray = function(arr) {
var s = new Set();
s.add.apply(s, arr);
return s;};
不同名字的工廠方法用以執行不同的初始化。但由於建構子是類別的公有標識,因此每個類別只能有一個建構子。但這並不是一個必須遵守的規則。
輔助建構子
透過以函數的形式呼叫Set()來初始化這個新物件
複製程式碼
程式碼如下:
//定義Set 類型的一個輔助建構子
function SetFromArray(arr) {
// 以函數的形式呼叫Set()來初始化這個新物件
// 將arr的元素作為參數傳入
Set.apply(this, arr) ;
}
// 設定原型,以便SetFromArray能建立Set實例SetFromArray.prototype = Set.prototype;
JavaScript 沒有做不到,只有想不到