JavaScript. Подробное руководство, 6-е издание
Большинство реализаций JavaScript (за исключением веб-броузера IE) поддерживали синтаксис
и<b>get</b>в литералах объектов еще до принятия стандарта ECMAScript 5. Эти реализации поддерживают нестандартный, устаревший API для получения и назначения методов чтения и записи. Этот API состоит из четырех методов, доступных во всех объектах.<b>set</b>и<b>__lookupGetter__()</b>возвращают методы чтения и записи для указанного свойства. А методы<b>__lookupSetter__()</b>и<b>__defineGetter__()</b>позволяют определить метод чтения или записи:<b>__defineSetter__()</b>в первом аргументе они принимают имя свойства, а во втором - метод чтения или записи. Имена всех этих методов начинаются и оканчиваются двумя символами подчеркивания, чтобы показать, что они являются нестандартными методами. Эти нестандартные методы не описываются в справочном разделе.
6.8. Атрибуты объекта
Все объекты имеют атрибуты
,<b>prototype</b>и<b>class</b>. Все эти атрибуты описываются в подразделах ниже; в них также рассказывается, как получать и изменять значения атрибутов (если это возможно).<b>extensible</b>6.8.1. Атрибут prototype
Атрибут
объекта определяет объект, от которого наследуются свойства. (Дополнительные сведения о прототипах и наследовании прототипов приводятся в разделах 6.1.3 и 6.2.2.) Этот атрибут играет настолько важную роль, что обычно мы будем говорить о нем как о «прототипе объекта о», а не как об «атрибуте<b>prototype</b>объекта о». Кроме того, важно понимать, что когда в программном коде встречается ссылка<b>prototype</b>, она обозначает обычное свойство объекта, а не атрибут<b>prototype</b>.<b>prototype</b>Атрибут
устанавливается в момент создания объекта. В разделе 6.1.3 уже говорилось, что для объектов, созданных с помощью литералов, прототипом является<b>prototype</b>. Прототипом объекта, созданного с помощью оператора<b>Object.prototype</b>, является значение свойства<b>new</b>конструктора. А прототипом объекта, созданного с помощью<b>prototype</b>становится первый аргумент этой функции (который может иметь значение<b>Object.сreate(),</b>).<b>null</b>Стандартом ECMAScript 5 предусматривается возможность определить прототип любого объекта, если передать его методу
В ECMAScript 3 отсутствует эквивалентная функция, но зачастую определить прототип объекта о можно с помощью выражения<b>Object.getPrototypeOf().</b>. Объекты, созданные с помощью оператора<b>о.constructor.prototype</b>, обычно наследуют свойство<b>new</b>, ссылающееся на функцию-конструктор, использованную для создания объекта. И как уже говорилось выше, функции-конструкторы имеют свойство<b>constructor</b>, которое определяет прототип объектов, созданных с помощью этого конструктора. Подробнее об этом рассказывается в разделе 9.2, где также объясняется, почему этот метод определения прототипа объекта не является достаточно надежным. Обратите внимание, что объекты, созданные с помощью литералов объектов или<b>prototype</b>получают свойство<b>Object.сгеate(),</b>, ссылающееся на конструктор<b>constructor</b>Таким образом,<b>Object().</b>ссылается на истинный прототип для литералов объектов, но обычно это не так для объектов, созданных вызовом<b>constructor.prototype</b><b>Object.create().</b>Чтобы определить, является ли один объект прототипом (или звеном в цепочке прототипов) другого объекта, следует использовать метод
Чтобы узнать, является ли<b>isPrototypeOf().</b>прототипом<b>р</b>, нужно записать выражение<b>о</b>. Например:р.isPrototypeOf(о)<b>var р = {х:1}; // Определить объект-прототип.</b><b>var о = Object.сreate(p); // Создать объект с этим прототипом.</b><b>р.isPrototypeOf(o) // => true: о наследует р</b><b>Object.prototype.isPrototypeOf(р) // => true: р наследует Object.prototype</b>Обратите внимание, что
по своему действию напоминает оператор<b>isPrototypeOf()</b>(раздел 4.9.4).<b>instanceof</b>В реализации JavaScript компании Mozilla (первоначально созданной в Netscape) значение атрибута
доступно через специальное свойство<b>prototype</b>, которое можно использовать напрямую для определения и установки прототипа любого объекта. Использование свойства<b>__proto__</b>ухудшает переносимость: оно отсутствует (и, вероятно, никогда не появится) в реализациях броузеров IE или Opera, хотя в настоящее время оно поддерживается броузерами Safari и Chrome. Версии Firefox, реализующие стандарт ECMAScript 5, все еще поддерживают свойство<b>__proto__ </b>, но не позволяют изменять прототип нерасширяемых объектов.<b>__proto__</b>6.8.2. Атрибут class
Атрибут
объекта - это строка, содержащая информацию о типе объекта. Ни в ECMAScript 3, ни в ECMAScript 5 не предусматривается возможность изменения этого атрибута и предоставляются лишь косвенные способы определения его значения. По умолчанию метод<b>class</b>(наследуемый от<b>toString()</b>) возвращает строку вида:<b>Object.prototype</b><b>[object class]</b>Поэтому, чтобы определить класс объекта, можно попробовать вызвать метод
этого объекта и извлечь из результата подстроку с восьмого по предпоследний символ. Вся хитрость состоит в том, что многие методы наследуют другие, более полезные реализации метода<b>toString()</b>, и чтобы вызвать нужную версию<b>toString()</b>необходимо выполнить косвенный вызов с помощью метода<b>toString(),</b>(раздел 8.7.3). В примере 6.4 определяется функция, возвращающая класс любого объекта, переданного ей.<b>Function.саll()</b>