mozilla
您的搜尋結果

    建構子中的全域資訊

    建構子中的全域資訊

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

    Document Tags and Contributors

    Contributors to this page: teoli, happysadman
    最近更新: teoli,