建構子中的全域資訊

建構子中的全域資訊

當你建立建構子的時候,如果你在建構子中設定全域資訊,需要很小心。例如,假定你想要自動的給每一個新的職員指定一個專有的 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。

文件標籤與貢獻者

 此頁面的貢獻者: teoli, happysadman
 最近更新: teoli,