Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2867 / 252 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 6:

Классы

Что означают скрытые поля

Поле __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. Собственно, ссылка на базовый конструктор в этом поле и хранится. Но подробнее об этом мы поговорим в следующей лекции.