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() возвращает вновь созданный объект, наследующий свойства
// объекта-прототипа р. Использует функцию 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. Получение и изменение свойств
Получить значение свойства можно с помощью операторов точки ( .
) и квадратных скобок ( [ ]
), описанных в разделе 4.4. Слева от оператора должно находиться выражение, возвращающее объект. При использовании оператора точки справа должен находиться простой идентификатор, соответствующий имени свойства. При использовании квадратных скобок в квадратных скобках должно указываться выражение, возвращающее строку, содержащую имя требуемого свойства:
var author = book.author; // Получить свойство "author" объекта book.
var name = author.surname // Получить свойство "surname" объекта author.
var title = book["main title"] // Получить свойство "main title" объекта book.
Чтобы создать новое свойство или изменить значение существующего свойства, также используются операторы точки и квадратные скобки, как в операциях чтения значений свойств, но само выражение помещается уже слева от оператора присваивания:
book.edition = 6; // Создать свойство "edition" объекта book.
book["main title"] = "ECMAScript"; // Изменить значение свойства "main title".
В ECMAScript 3 идентификатор, следующий за точкой, не может быть зарезервированным словом: нельзя записать обращение к свойству о.for
или о.class
, потому что for
является ключевым словом, a class
- словом, зарезервированным для использования в будущем. Если объект имеет свойства, имена которых совпадают с зарезервированными словами, для доступа к ним необходимо использовать форму записи с квадратными скобками: o["for"]
и o["class"].
Стандарт ECMAScript 5 ослабляет это требование (как это уже сделано в некоторых реализациях ECMAScript 3) и допускает возможность использования зарезервированных слов после оператора точки.
Читать дальше
Конец ознакомительного отрывка
Купить книгу