實體關係的確定
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)