Книга: Выразительный JavaScript
Прототипы
Прототипы
Следите за руками.
var empty = {};
console.log(empty.toString);
// ? function toString(){…}
console.log(empty.toString());
// ? [object Object]
Я достал свойство пустого объекта. Магия!
Ну, не магия, конечно. Я просто не всё рассказал про то, как работают объекты в JavaScript. В дополнение к набору свойств, почти у всех также есть прототип. Прототип – это ещё один объект, который используется как запасной источник свойств. Когда объект получает запрос на свойство, которого у него нет, это свойство ищется у его прототипа, затем у прототипа прототипа, и т. д.
Ну а кто же прототип пустого объекта? Это великий предок всех объектов, Object.prototype
.
console.log(Object.getPrototypeOf({}) == Object.prototype);
// ? true
console.log(Object.getPrototypeOf(Object.prototype));
// ? null
Как и следовало ожидать, функция Object.getPrototypeOf
возвращает прототип объекта.
Прототипические отношения в JavaScript выглядят как дерево, в корне которого находится Object.prototype
. Он предоставляет несколько методов, которые появляются у всех объектов. Например, toString
, который преобразует объект в строковый вид.
Прототипом многих объектов служит не непосредственно Object.prototype
, а какой-то другой объект, который предоставляет свои свойства по умолчанию. Функции происходят от Function.prototype
, массивы – от Array.prototype
.
console.log(Object.getPrototypeOf(isNaN) == Function.prototype);
// ? true
console.log(Object.getPrototypeOf([]) == Array.prototype);
// ? true
У таких прототипов будет свой прототип – часто Object.prototype
, поэтому он всё равно, хоть и не напрямую, предоставляет им методы типа toString
.
Функция Object.getPrototypeOf
возвращает прототип объекта. Можно использовать Object.create
для создания объектов с заданным прототипом.
var protoRabbit = {
speak: function(line) {
console.log("А " + this.type + " кролик говорит '" + line + "'");
}
};
var killerRabbit = Object.create(protoRabbit);
killerRabbit.type = "убийственный";
killerRabbit.speak("ХРЯЯЯСЬ!");
// ? А убийственный кролик говорит 'ХРЯЯЯСЬ!'
Прото-кролик работает в качестве контейнера свойств, которые есть у всех кроликов. Конкретный объект-кролик, например убийственный, содержит свойства, применимые только к нему – например, свой тип – и наследует разделяемые с другими свойства от прототипа.
- 9.1. Классы и прототипы
- Прототипы – это опора программистов
- 3.4.3. Прототипы функций
- 6.1.3. Прототипы
- 11 Прототипы и памятные записки
- Для чего создаются прототипы
- Как использовать прототипы
- Как не надо использовать прототипы
- Правило 21. Визуализируйте идеи – создавайте эскизы, модели и прототипы
- Прототипы – ваши друзья
- С чего начинаются прототипы?
- Прототипы для проектов без пользовательского интерфейса