Книга: JavaScript. Подробное руководство, 6-е издание
6.1.4. Object.create()
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]
Пример 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. Об этом рассказывается в следующем разделе.
- Creating and Deleting Device Objects
- Метод CreateObject
- Object inheritance
- Scaling makes your object darker?
- 5.1.1. The Image Object
- Переопределение System.Object.GetHashCode()
- Object Orientation
- Class and Object Variables
- 5.1.2. Architecture Objects
- 6.6. OBJECT-BASED DISTRIBUTED SHARED MEMORY
- 6.6.1. Objects
- 7.2. OBJECTS AND CAPABILITIES IN AMOEBA