寫在前面
有時候我們希望對象的初始化有多種方式。比如通過元素組成的數組來初始化一個Set對象,而不是通過傳入構造函數的參數列表來初始化它
通過重載這個構造函數方法讓它根據傳入參數的不同,來執行不同的初始化方法。
復制代碼 代碼如下:
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()方法)。
一個類的方法用於返回類的一個實例。
復制代碼 代碼如下:
// 工廠方法通過數組初始化Set對象
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 沒有做不到,只有想不到