Ядро JavaScript 1.5. Руководство по использованию

Определение Взаимодействия Экземпляров


Вам, возможно, понадобится знать, какие объекты находятся в цепочке прототипов для данного объекта, чтобы знать, из каких объектов данный объект наследует свойства.


Начиная с JavaScript версии 1.4, JavaScript предоставляет операцию instanceof для тестирования цепочки прототипов. Эта операция работает точно так же, как функция instanceof, рассматриваемая ниже.

Как уже говорилось в , если Вы используете оператор new и конструктор функции для создания нового объекта, JavaScript устанавливает в свойство __proto__ нового объекта значение свойства prototype конструктора функции. Вы можете использовать это для проверки цепи прототипов.


Например, предположим, у Вас есть уже рассмотренный ранее набор определений с прототипами, установленными соответствующим образом. Создайте объект __proto__ таким образом:

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)





Содержание раздела