0:00
В этом видео мы научимся с вами инспектировать связи между объектами,
прототипами и конструкторами.
С одним из способов вы уже знакомы — это метод 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.