Apply your JS skills to key Mozilla projects as an MDN Fellow! http://mzl.la/MDNFellowship

mozilla
您的搜尋結果

    實體關係的確定

    實體關係的確定

    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: happysadman, teoli
    最近更新: teoli,