Атрибут prototype
Атрибут prototype
объекта определяет объект, от которого наследуются свойства.
Важно понимать, что когда в программном коде встречается ссылка prototype, она обозначает обычное свойство объекта, а не атрибут prototype.
Атрибут prototype
устанавливается в момент создания объекта.
- Для объектов, созданных с помощью литералов, прототипом является
Object.prototype
. - Прототипом объекта, созданного с помощью оператора new, является значение
свойства prototype конструктора
. - Прототипом объекта, созданного с помощью
Object.create()
, становится первый аргумент этой функции (который может иметь значение null).
Стандартом ECMAScript 5 предусматривается возможность определить прототип любого объекта, если передать его методу Object.getPrototypeOf()
.
Чтобы определить, является ли один объект прототипом (или звеном в цепочке прототипов) другого объекта, следует использовать метод isPrototypeOf()
. Чтобы узнать, является ли p
прототипом o
, нужно записать выражение p.isPrototypeOf(o)
.
Например:
var p = {x:1}; // Определить объект-прототип.
var o = Object.create(p); // Создать объект с этим прототипом.
p.isPrototypeOf(o) // => true: o наследует p
Object.prototype.isPrototypeOf(p) // => true: p наследует Object.prototype
P.S: В реализации JavaScript компании Mozilla (первоначально созданной в Netscape) значение атрибута prototype
доступно через специальное свойство __proto__
, которое можно использовать напрямую для определения и установки прототипа любого объекта. Использование свойства __proto__
ухудшает переносимость: оно отсутствует в реализациях броузеров IE или Opera, хотя в настоящее время оно поддерживается броузерами Safari и Chrome. Версии Firefox, реализующие стандарт ECMAScript 5, все еще поддерживают свойство __proto__
, но не позволяют изменять прототип нерасширяемых объектов.