建構子中的全域資訊
建構子中的全域資訊
當你建立建構子的時候,如果你在建構子中設定全域資訊,需要很小心。例如,假定你想要自動的給每一個新的職員指定一個專有的 ID。你可以給 Employee
使用下面的定義︰
var idCounter = 1; function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; this.id = idCounter++; }
根據這個定義,當你建立新的 Employee
的時候,建構子會依序把下一個 ID 指定給他,然後增加全域 ID 的計數器。因此,如果你的下一條語句如下,victoria.id
為 1,且 harry.id
為 2︰
victoria = new Employee("Pigbert, Victoria", "pubs") harry = new Employee("Tschopik, Harry", "sales")
乍看之下很好。然而,idCounter
會在每一次建立 Employee
物件的時候遞增,而不問用途。如果你建立顯示在本章中的整個 Employee
階層結構,Employee
建構子會在你每一次設定原型的時候被呼叫。假設你有下面的代碼︰
var idCounter = 1; function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; this.id = idCounter++; } function Manager (name, dept, reports) {...} Manager.prototype = new Employee; function WorkerBee (name, dept, projs) {...} WorkerBee.prototype = new Employee; function Engineer (name, projs, mach) {...} Engineer.prototype = new WorkerBee; function SalesPerson (name, projs, quota) {...} SalesPerson.prototype = new WorkerBee; mac = new Engineer("Wood, Mac");
在此略過 base
屬性的定義,並呼叫原型鏈中在他們之上的建構子。在這個情況下,等到 mac
物件被建立的時候,mac.id
是 5。
根據應用程式而定,計數器遞增了額外的次數,這也許重要,也許不重要。如果你很在意計數器額外的數值,有一個可能的解決方案是改用下面的建構子來代替︰
function Employee (name, dept) { this.name = name || ""; this.dept = dept || "general"; if (name) this.id = idCounter++; }
當你建立用作為原型的 Employee
實體時候,你並不需要提供參數給建構子。使用這個定義的建構子,當你並未提供參數時,建構子並不會把值代入給 id,也不會更新計數器。因此,若要 Employee
取得指定的 id,你就必須為職員指定名稱。在這個範例中,mac.id
將會是 1。