Перевод статьи Dr. Axel Rauschmayer‘а “JavaScript terminology: the two prototypes”.
К сожалению, в JavaScript’е термин “прототип” (“prototype”) имеет несколько значений.
Прототип 1: связь между объектами
Во-первых, существуют прототипы объектов.
Согласно спецификации ECMAScript, некоторые свойства объектов являются внутренними. Внутренние свойства напрямую недоступны из JavaScript’а, их имена пишутся в двойных квадратных скобках. Одно их таких свойств, [[Prototype]], используется для реализации прототипного наследования. Каждый объект содержит в [[Prototype]] ссылку на свой прототип и т.о. наследует все его свойства. В ECMAScript 5 стало возможно получить ссылку на прототип объекта с помощью функции Object.getPrototypeOf()
:
1 2 |
|
И возможно создать новый объект, явно указав его прототип, с помощью функции Object.create()
:
1 2 3 4 |
|
Подробнее про обе эти функции можно почитать по ссылке [1]. В ECMAScript 6 можно будет получить ссылку на прототип объекта, используя специальное свойство __proto__
[2].
Прототип 2: свойство конструктора
Во-вторых, каждый конструктор имеет свойство prototype
.
Это свойство содержит ссылку на объект, который будет прототипом всех объектов, которые будут созданы с помощью этого конструктора.
1 2 3 4 |
|
Разрешаем конфликт именований
Обычно из контекста понятно, какой из прототипов имеется ввиду. Если всё-таки возникает неопределённость, то под “prototype” приходится понимать прототип объекта, потому что именно в этом смысле этот термин используется в стандартной библиотеке в названии функции getPrototypeOf
. Получается, нужно искать другое название для объекта, на который ссылается свойство prototype
конструкторов. Можно было бы использовать термин “прототип конструктора” (“constructor prototype”), но это не избавит нас от неоднозначности, потому что у конструкторов тоже есть свой прототип:
1 2 3 |
|
В итоге, наилучшим вариантом выглядит “прототип экземпляра” (“instance prototype”).
Ссылки
[1] JavaScript inheritance by example
[2] JavaScript: __proto__