В этом видео мы научимся с вами инспектировать связи между объектами, прототипами и конструкторами. С одним из способов вы уже знакомы — это метод getPrototypeOf. На вход он принимает в себя объект, а на выходе дает ссылку на прототип для этого объекта. В данном случае у нас есть объект студента, в качестве прототипа для которого выступает объект person. Вызвав метод getPrototypeOf и передав туда ссылку на объект студента, мы на выходе получим на объект person. Следующий способ инспектирования связей между объектами и прототипом предлагает нам метод isPrototypeOf. Давайте посмотрим, как он работает. Допустим, у нас есть некий конструктор студентов, который на вход принимает имя студента и сохраняет его в поле name для каждого студента. Далее, мы хотим к каждому студенту привязать некоторый прототип. Мы помещаем этот прототип в специальное поле Prototype, в хранилище, и делаем его объектом на основе другого хранилища — конструктора person при помощи метода create. Далее, мы в наше хранилище добавляем специфичный для студентов метод sleep и восстанавливаем конструктор. Попробуем теперь создать нашего студента и воспользоваться для проверки связи между созданным студентом и его прототипом методом isPrototypeOf. Данный метод отвечает на вопрос: «Является ли объект прототипом для того объекта, который мы передаем в качестве аргументов?» И действительно, для billy прототипом будет являться тот объект, который мы поместили в хранилище конструктора, — в поле Prototype конструктора Student. Более того, данный метод позволяет инспектировать не только прямую связь, но и связь конечного объекта с одним из прототипов цепочки. Таким образом, он даст утвердительный ответ и на вопрос: «Является ли объект, который лежит в хранилище конструктора person, прототипом для billy?» И действительно, является. Более того, он утвердительно ответит и на вопрос: «Является ли глобальный прототип для всех объектов прототипом для billy?» Очевидно, это так. Следующий способ инспектирования связей между объектами и конструкторами — специальный оператор instanceof. Он позволяет ответить на вопрос: «Является ли объект объектом определенного конструктора?» В данном случае мы создали нового студента billy на основе конструктора Student и проверяем, является ли billy объектом этого конструктора. Да, действительно является. Но этот оператор работает несколько сложнее, и он ответит утвердительно на следующий вопрос, что billy является и объектом конструктора Person, хотя напрямую это не так. Но можно заметить, что хранилище, связанное с конструктором Person, лежит в цепочке прототипов до billy. Если мы немножечко переформулируем то, как работает этот оператор, все встанет на свои места. Можно сказать, что он отвечает на вопрос: «Является ли billy, например, студентом?» Да, действительно является. Или: «Является ли billy личностью?» И это тоже так. Более того, billy, конечно же, является объектом — тоже правда. Давайте разберем, как работает оператор instanceof. Например, как он проверяет, связаны ли между собой объект billy с конструктором Person. Вначале он проверяет, является ли прототипом для billy объект, который хранится в хранилище этого конструктора. И это не так. Тогда он проверяет следующую гипотезу: «А, может быть, прототипа у billy совсем нет, и там хранится значение null?» Эта гипотеза также не подтверждается, и тогда он идет по цепочке прототипов. Он проверяет, является ли прототип прототипа billy объектом, который хранится в хранилище конструктора Person. На этот раз гипотеза подтверждается, и в этом случае данный оператор отвечает нам true. Если мы попробуем проинспектировать объект с самой короткой цепочкой прототипов. Напоминаю, чтобы создать такой объект, нам необходимо воспользоваться методом create и передать туда не объект, а null. В этом случае оператор instanceof возвращает нам false, и это немножко противоречит здравому смыслу. Вроде как мы создаем объект и проверяем, что этот объект — это действительно объект, но оператор instanceof возвращает нам false. Если мы еще раз посмотрим, как работает этот оператор, все встанет на свои места. Итак, в первую очередь, он проверяет, является ли прототипом для нашего одинокого объекта глобальный прототип для всех объектов. Очевидно, это не так. Тогда он проверяет: «Возможно, у нашего одинокого объекта совсем нет прототипа, и во внутреннем поле prototype лежит значение null?» И эта гипотеза подтверждается. Ведь мы сами создали такой объект, передав метод create(null). В этом случае оператор instanceof при положительном подтверждении такой гипотезы возвращает нам false.