Чтение онлайн

на главную - закладки

Жанры

JavaScript. Подробное руководство, 6-е издание
Шрифт:

Object.prototype
– один из немногих объектов, которые не имеют прототипа: у него нет унаследованных свойств. Другие объекты-прототипы являются самыми обычными объектами, имеющими собственные прототипы. Все встроенные конструкторы (и большинство пользовательских конструкторов) наследуют прототип
Object.prototype
. Например,
Date. prototype
наследует свойства от
Object.prototype
, поэтому объект
Date
, созданный выражением
new Date,
наследует
свойства от обоих прототипов,
Date.prototype
и
Object.prototype
. Такая связанная последовательность объектов-прототипов называется цепочкой прототипов.

Описание механизма наследования свойств приводится в разделе 6.2.2. Как получить ссылку на прототип объекта, рассказывается в разделе 6.8.1. А в главе 9 более детально будет обсуждаться связь между прототипами и конструкторами: там будет показано, как определять новые «классы» объектов посредством объявления функций-конструкторов и как записывать ссылку на объект-прототип в их свойство prototype для последующего использования «экземплярами», созданными с помощью этого конструктора.

6.1.4. Object.create

Стандарт ECMAScript 5 определяет метод

Object.create,
который создает новый объект и использует свой первый аргумент в качестве прототипа этого объекта. Дополнительно
Object.create
может принимать второй необязательный аргумент, описывающий свойства нового объекта. Описание этого второго аргумента приводится в разделе 6.7.

Object.create
является статической функцией, а не методом, вызываемым относительно некоторого конкретного объекта. Чтобы вызвать эту функцию, достаточно передать ей желаемый объект-прототип:

var о1 = Object.create({x:1, у:2}); // о1 наследует свойства х и у.

Чтобы создать объект, не имеющий прототипа, можно передать значение

null
, но в этом случае вновь созданный объект не унаследует ни каких-либо свойств, ни базовых методов, таких как
toString
(а это означает, что этот объект нельзя будет использовать в выражениях с оператором +):

var о2 = Object.create(null); // о2 не наследует ни свойств, ни методов
.

Если в программе потребуется создать обычный пустой объект (который, например, возвращается литералом {} или выражением

new Object
), передайте в первом аргументе
Object.prototype
:

var о2 = Object.create(Object.prototype); // о3 подобен объекту, созданному

// с помощью {} или new Object.

Возможность создавать новые объекты с произвольными прототипами (скажем иначе: возможность создавать «наследников» от любых объектов) является мощным инструментом, действие которого можно имитировать в ECMAScript 3 с помощью функции, представленной в примере 6.1. [8]

8

Дуглас Крокфорд (Douglas Crockford) считается первым, кто реализовал функцию,

создающую объекты таким способом. См. http://javascript.crockford.com/prototypal.html.

)

Пример 6.1. Создание нового объекта, наследующего прототип

// inherit возвращает вновь созданный объект, наследующий свойства

// объекта-прототипа р. Использует функцию Object.create из ECMAScript 5,

// если она определена, иначе используется более старый прием,

function inherit(р) {

if (р == null) throw ТуреЕrror; // р не может быть значением null

if (Object.create) // Если Object.create определена...

return Object.create(p); // использовать ее.

var t = typeof p; // Иначе выяснить тип и проверить его

if (t !== "object" && t !== "function") throw ТуреЕrror;

function f {}; // Определить фиктивный конструктор,

f.prototype = p; // Записать в его свойство prototype

// ссылку на объект р.

return new f; // Использовать f для создания

// "наследника" объекта р.

}

Реализация функции

inherit
приобретет больше смысла, как только мы познакомимся с конструкторами в главе 9. А пока просто считайте, что она возвращает новый объект, наследующий свойства объекта в аргументе. Обратите внимание, что функция
inherit
не является полноценной заменой для
Object.create
: она не позволяет создавать объекты без прототипа и не принимает второй необязательный аргумент, как
Object.сreate.
Тем не менее мы будем использовать функцию
inherit
во многих примерах в этой главе и в главе 9.

Функцию

inherit
можно использовать, чтобы защитить объекты от непреднамеренного (не с целью нанести вред) изменения их библиотечными функциями, неподконтрольными вам. Вместо того чтобы передавать функции сам объект непосредственно, можно передать его наследника. Если функция прочитает свойства наследника, она получит унаследованные значения. Однако если она изменяет значения свойств, эти изменения коснутся только наследника и никак не отразятся на оригинальном объекте:

var о = { х: "не изменяйте это значение" };

library_function(inherit(o)); // Защита объекта о от непреднамеренного изменения

Чтобы понять принцип действия этого приема, необходимо знать, как производится чтение и запись значений свойств объектов в языке JavaScript. Об этом рассказывается в следующем разделе.

6.2. Получение и изменение свойств

Поделиться:
Популярные книги

Том 2. Советская литература

Луначарский Анатолий Васильевич
2. Собрание сочинений в восьми томах
Документальная литература:
критика
5.00
рейтинг книги
Том 2. Советская литература

Неудержимый. Книга VI

Боярский Андрей
6. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга VI

Гражданская война 1918-1921 гг. — урок для XXI века

Кара-Мурза Сергей Георгиевич
Научно-образовательная:
политика
5.00
рейтинг книги
Гражданская война 1918-1921 гг. — урок для XXI века

Тайные силы в истории России

Бегунов Юрий Константинович
Документальная литература:
публицистика
5.00
рейтинг книги
Тайные силы в истории России

Последний реанорец. Том I и Том II

Павлов Вел
1. Высшая Речь
Фантастика:
фэнтези
7.80
рейтинг книги
Последний реанорец. Том I и Том II

Ночные всадники. Нарушители закона. Чертово болото

Кэллэм Ридгуэлл
Приключения:
вестерны
6.25
рейтинг книги
Ночные всадники. Нарушители закона. Чертово болото

Форма. Стиль. Выражение

Лосев Алексей Федорович
Научно-образовательная:
философия
5.00
рейтинг книги
Форма. Стиль. Выражение

Эйнштейн. Его жизнь и его Вселенная

Айзексон Уолтер
Документальная литература:
биографии и мемуары
5.50
рейтинг книги
Эйнштейн. Его жизнь и его Вселенная

Хроники Элении (сборник)

Эддингс Дэвид
Шедевры фантастики
Фантастика:
фэнтези
7.86
рейтинг книги
Хроники Элении (сборник)

Кодекс Охотника. Книга XVIII

Винокуров Юрий
18. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга XVIII

Кто изобрел современную физику? От маятника Галилея до квантовой гравитации

Горелик Геннадий
Научно-образовательная:
история
физика
6.25
рейтинг книги
Кто изобрел современную физику? От маятника Галилея до квантовой гравитации

Civilization

Коллингвуд Виктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Civilization

Эволюционер из трущоб. Том 6

Панарин Антон
6. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 6

Ткущая. Обманутые секунды

Тарасова Анна
3. Ткущая
Любовные романы:
любовно-фантастические романы
8.27
рейтинг книги
Ткущая. Обманутые секунды