Книга: JavaScript. Подробное руководство, 6-е издание
6.8.1. Атрибут prototype
6.8.1. Атрибут prototype
Атрибут prototype
объекта определяет объект, от которого наследуются свойства. (Дополнительные сведения о прототипах и наследовании прототипов приводятся в разделах 6.1.3 и 6.2.2.) Этот атрибут играет настолько важную роль, что обычно мы будем говорить о нем как о «прототипе объекта о», а не как об «атрибуте prototype
объекта о». Кроме того, важно понимать, что когда в программном коде встречается ссылка prototype
, она обозначает обычное свойство объекта, а не атрибут prototype
.
Атрибут prototype
устанавливается в момент создания объекта. В разделе 6.1.3 уже говорилось, что для объектов, созданных с помощью литералов, прототипом является Object.prototype
. Прототипом объекта, созданного с помощью оператора new
, является значение свойства prototype
конструктора. А прототипом объекта, созданного с помощью Object.сreate(),
становится первый аргумент этой функции (который может иметь значениеnull
).
Стандартом ECMAScript 5 предусматривается возможность определить прототип любого объекта, если передать его методу Object.getPrototypeOf().
В ECMAScript 3 отсутствует эквивалентная функция, но зачастую определить прототип объекта о можно с помощью выражения о.constructor.prototype
. Объекты, созданные с помощью оператора new
, обычно наследуют свойство constructor
, ссылающееся на функцию-конструктор, использованную для создания объекта. И как уже говорилось выше, функции-конструкторы имеют свойство prototype
, которое определяет прототип объектов, созданных с помощью этого конструктора. Подробнее об этом рассказывается в разделе 9.2, где также объясняется, почему этот метод определения прототипа объекта не является достаточно надежным. Обратите внимание, что объекты, созданные с помощью литералов объектов или Object.сгеate(),
получают свойство constructor
, ссылающееся на конструктор Object().
Таким образом, constructor.prototype
ссылается на истинный прототип для литералов объектов, но обычно это не так для объектов, созданных вызовом Object.create().
Чтобы определить, является ли один объект прототипом (или звеном в цепочке прототипов) другого объекта, следует использовать метод isPrototypeOf().
Чтобы узнать, является ли р
прототипом о
, нужно записать выражение р.isPrototypeOf(о)
. Например:
var р = {х:1}; // Определить объект-прототип.
var о = Object.сreate(p); // Создать объект с этим прототипом.
р.isPrototypeOf(o) // => true: о наследует р
Object.prototype.isPrototypeOf(р) // => true: р наследует Object.prototype
Обратите внимание, что isPrototypeOf()
по своему действию напоминает оператор instanceof
(раздел 4.9.4).
В реализации JavaScript компании Mozilla (первоначально созданной в Netscape) значение атрибута prototype
доступно через специальное свойство __proto__
, которое можно использовать напрямую для определения и установки прототипа любого объекта. Использование свойства __proto__
ухудшает переносимость: оно отсутствует (и, вероятно, никогда не появится) в реализациях броузеров IE или Opera, хотя в настоящее время оно поддерживается броузерами Safari и Chrome. Версии Firefox, реализующие стандарт ECMAScript 5, все еще поддерживают свойство __proto__
, но не позволяют изменять прототип нерасширяемых объектов.
- 6.8. Атрибуты объекта
- 8.7.2. Свойство prototype
- 1.3.5. Методы и атрибуты
- 2. Домены и атрибуты
- 4. Виртуальные атрибуты
- 7. Унификация атрибутов
- У файла и каталога есть атрибуты (например: Скрытый, Только чтение). Как ими управлять из командной строки?
- Атрибутные сертификаты
- Применение пользовательских атрибутов
- 20.2.1. Атрибуты cookie: срок хранения и область видимости
- 19.2.1. Чтение и запись значений HTML-атрибутов
- 4.1.1 Function Prototypes