Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание
- Название:JavaScript. Подробное руководство, 6-е издание
- Автор:
- Жанр:
- Издательство:Символ-Плюс
- Год:2012
- Город:СПб
- ISBN:978-5-93286-215-5
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дэвид Флэнаган - JavaScript. Подробное руководство, 6-е издание краткое содержание
Эта книга - одновременно и руководство программиста, и полноценный справочник по базовому языку JavaScript и клиентским прикладным интерфейсам, предоставляемым веб-броузерами.
JavaScript. Подробное руководство, 6-е издание - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
'sub-title': "The Definitive Guide", // и дефисами, поэтому используются
// строковые литералы
"for": "all audiences", // for - зарезервированное слово,
// поэтому в кавычках
author: { // Значением этого свойства является
firstname: "David”, // объект. Обратите внимание, что
surname: "Flanagan" // имена этих свойств без кавычек.
}
}
В ECMAScript 5 (и в некоторых реализациях ECMAScript 3) допускается использовать зарезервированные слова в качестве имен свойств без кавычек. Однако в целом имена свойств, совпадающие с зарезервированными словами, в ECMAScript 3 должны заключаться в кавычки. В ECMAScript 5 последняя запятая, следующая за последним свойством в литерале объекта, игнорируется. В большинстве реализаций ECMAScript 3 завершающие запятые также игнорируются, но IE интерпретирует их наличие как ошибку.
Литерал объекта - это выражение, которое создает и инициализирует новый объект всякий раз, когда производится вычисление этого выражения. Значение каждого свойства вычисляется заново, когда вычисляется значение литерала. Это означает, что с помощью единственного литерала объекта можно создать множество новых объектов, если этот литерал поместить в тело цикла или функции, которая будет вызываться многократно, и что значения свойств этих объектов могут отличаться друг от друга.
6.1.2. Создание объектов с помощью оператора new
Оператор new создает и инициализирует новый объект. За этим оператором должно следовать имя функции. Функция, используемая таким способом, называется конструктором и служит для инициализации вновь созданного объекта. Базовый JavaScript включает множество встроенных конструкторов для создания объектов базового языка. Например:
var о = new Object(); // Создать новый пустой объект: то же, что и {}.
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] Дуглас Крокфорд (Douglas Crockford) считается первым, кто реализовал функцию, создающую объекты таким способом. См. http://javascript.crockford.com/prototypal.html .
)
Пример 6.1. Создание нового объекта, наследующего прототип
// inherit() возвращает вновь созданный объект, наследующий свойства
Интервал:
Закладка: