實體關係的確定

由 2 位貢獻者:

實體關係的確定

Javascript 搜尋屬性時,會先從物件內部所擁有的屬性開始,如果找不到屬性的名稱,就會從特殊的物件屬性 __proto__ 內部搜尋。不斷反覆執行;這個過程就稱為〝在原型鏈中搜尋〞。

當物件建構完成時,就會設定這個特殊的屬性 __proto__;他會被設成建構子的 prototype 屬性的值。因此,表達式 new Foo() 會以 __proto__ == Foo.prototype 來建立物件。因此,變更 Foo.prototype 的屬性,就會改變所有由 new Foo() 所建立的物件的屬性的搜尋。

每一個物件都有 __proto__ 物件屬性(除了 Object 以外);每一個函數都有 prototype 物件屬性。所以物件可藉由“原型的繼承”與其他物件建立起關係。你可以藉由物件的 __proto__ 與函數的 prototype 物件的比較來對繼承進行測試。JavaScript 也提供了便捷方式︰instanceof 運算子會對照函數以檢測物件,如果這個物件繼承自函數的原型,就返回 true。例如,

var f = new Foo();
var isTrue = (f instanceof Foo);

舉個更詳細的例子,假設你有顯示在 屬性的繼承 中的同一組定義。並建立 Engineer 物件如下︰

chris = new Engineer("Pigman, Chris", ["jsd"], "fiji");

對於這個物件,以下語句全部為 true︰

chris.__proto__ == Engineer.prototype;
chris.__proto__.__proto__ == WorkerBee.prototype;
chris.__proto__.__proto__.__proto__ == Employee.prototype;
chris.__proto__.__proto__.__proto__.__proto__ == Object.prototype;
chris.__proto__.__proto__.__proto__.__proto__.__proto__ == null;

有鑑於此,你可以編寫 instanceOf 函數如下︰

function instanceOf(object, constructor) {
   while (object != null) {
      if (object == constructor.prototype)
         return true;
      object = object.__proto__;
   }
   return false;
}

根據這個定義,以下語句全部為 true︰

instanceOf (chris, Engineer)
instanceOf (chris, WorkerBee)
instanceOf (chris, Employee)
instanceOf (chris, Object)

但下面的表達式是 false︰

instanceOf (chris, SalesPerson)

Document Tags and Contributors

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