Беларусь, рогачёв |
Классы
Что означают скрытые поля
Поле __proto__
Как мы уже говорили, про это поле написано в документации, так что не нужно считать скрытые от for...in поля чем-то запретным. Итак, в поле __proto__ любого объекта хранится ссылка на прототип того класса, к которому объект принадлежит. Представим себе, что у нас имеется объект неизвестного нам класса. В таком случае нам неизвестен конструктор, и обратиться к прототипу через поле prototype конструктора мы не можем. Так вот, поле __proto__ решает эту пр облему - оно есть в каждом объекте и искать конструктор вовсе не нужно.
Поле constructor
Впрочем, на самом-то деле, имея объект, мы можем добраться и до его конструктора. Не зря же мы обнаружили поле constructor в каждом объекте. Разумеется, именно в нем и записана ссылка на конструктор класса, к которому принадлежит наш объект. Хотя пользоваться этим полем надо с осторожностью - оно недокументированное.
Итак, мы видим, что, имея объект myObject, мы можем обратиться к его прототипу двумя способами: или myObject.__proto__, или myObject.constructor.prototype.
Поле __constructor__
Интересно, что это поле существует не во всех объектах. В чем заключается разница, мы можем узнать, даже не прибегая к недокументированным функциям. Напишем и запустим следующий код:
myObject = new Object(); myObject1 = {}; trace(myObject.__constructor__); trace(myObject1.__constructor__);
На выходе мы получим:
[type Function] undefined
Только в объекте, созданном new обнаружилось поле __constructor__. То есть мы нашли способ выяснить, создан ли объект класса Object с помощью фигурных скобок или с помощью new ! Но предназначение поля __constructor__, разумеется, отнюдь не в этом. Предназначено оно для использования при наследовании и вызова конструктора базового класса с помощью ключевого слова super. Собственно, ссылка на базовый конструктор в этом поле и хранится. Но подробнее об этом мы поговорим в следующей лекции.