MDN’s new design is in Beta! A sneak peek: https://blog.mozilla.org/opendesign/mdns-new-design-beta/

屬性的繼承

屬性的繼承

假定你以如下語句建立了作為 WorkerBeemark 物件(如同 圖 8.3 所示)︰

mark = new WorkerBee;

當 JavaScript 看見 new 運算子的時候,他就會建立新的通用物件,並且把這個新物件當作 this 關鍵字的值傳給 WorkerBee 的建構子函數。建構子函數會明確的設定 projects 屬性的值,並且隱含的把 __proto__ 屬性內部的值設定成 WorkerBee.prototype 的值。(這個屬性的名稱前後各有兩個底線字元。)__proto__ 屬性決定了用來返回屬性值的原型鏈。這些屬性一經設定,JavaScript 返回新的物件,且代入語句會把變數 mark 設定給這個物件。

這個過程並不會把 mark 從原型鏈上繼承下來的屬性明確的放置在 mark 物件裡的值(局域值)。當你需要某個屬性值的時候,JavaScript 首先檢查這個值是否存在於物件裡。如果存在,就直接返回這個值。如果這些變數不在局域區塊裡,JavaScript 就會檢查原型鏈(使用 __proto__ 屬性)。如果在原型鏈上的物件有這個屬性的值,就會返回這個值。如果找不到這些屬性,JavaScript 會說這個物件並沒有這個屬性。以這種方式,mark 物件就有了如下屬性和值︰

mark.name = "";
mark.dept = "general";
mark.projects = [];

mark 物件從 mark.__proto__ 裡的原型物件繼承了 name 和 dept 屬性的值。他還藉由 WorkerBee 的建構子給 projects 屬性代入局域值。JavaScript 就這樣達成了屬性和值的繼承。這個過程的部分細節會在 再談屬性的繼承 裡討論。

因為這些建構子並不能讓你傳入特定實體的值,這些資訊是通用的。這些屬性值預設會被所有從 WorkerBee 建立的新物件所共享。當然你也可以修改任何屬性的值。因此,你可以給 mark 特定的資訊如下︰

mark.name = "Doe, Mark";
mark.dept = "admin";
mark.projects = ["navigator"];

 

文件標籤與貢獻者

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