Вход/Регистрация
JavaScript. Подробное руководство, 6-е издание
вернуться

Флэнаган Дэвид

Шрифт:

var а = new Аггау; // Создать пустой массив: то же, что и [].

var d = new Date; // Создать объект Date, представляющий текущее время

var г = new RegExp("js"); // Создать объект RegExp для операций

// сопоставления с шаблоном.

Помимо этих встроенных конструкторов имеется возможность определять свои собственные функции-конструкторы для инициализации вновь создаваемых объектов. О том, как это делается, рассказывается в главе 9.

6.1.3. Прототипы

Прежде чем перейти к третьему способу создания объектов, необходимо сделать паузу, чтобы познакомиться с прототипами. Каждый объект в языке JavaScript имеет второй объект (или

null
, но значительно реже), ассоциированный с ним. Этот второй объект называется прототипом, и первый объект наследует от прототипа его свойства.

Все объекты, созданные с помощью литералов объектов, имеют один и тот же объект-прототип, на который в программе JavaScript можно сослаться так:

Object.prototype
. Объекты, созданные с помощью ключевого слова
new
и вызова конструктора, в качестве прототипа получают значение свойства
prototype
функции-конструктора. Поэтому объект, созданный выражением
new Object
, наследует свойства объекта
Object.prototype
, как если бы он был создан с помощью литерала в фигурных скобках
{}
. Аналогично прототипом объекта, созданного выражением
new Array,
является
Array.prototype
, а прототипом объекта, созданного выражением
new Date,
является
Date.prototype
.

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(р) {

  • Читать дальше
  • 1
  • ...
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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