JavaScript. Подробное руководство, 6-е издание, стр. 62
Описание механизма наследования свойств приводится в разделе 6.2.2. Как получить ссылку на прототип объекта, рассказывается в разделе 6.8.1. А в главе 9 более детально будет обсуждаться связь между прототипами и конструкторами: там будет показано, как определять новые «классы» объектов посредством объявления функций-конструкторов и как записывать ссылку на объект-прототип в их свойство prototype для последующего использования «экземплярами», созданными с помощью этого конструктора.
6.1.4. Object.create()
Стандарт ECMAScript 5 определяет метод
<b>Object.create(),</b><b>Object.create()</b><b>Object.create()</b><b>var о1 = Object.create({x:1, у:2}); // о1 наследует свойства х и у.</b>Чтобы создать объект, не имеющий прототипа, можно передать значение
<b>null</b><b>toString()</b><b>var о2 = Object.create(null); // о2 не наследует ни свойств, ни методов</b>Если в программе потребуется создать обычный пустой объект (который, например, возвращается литералом {} или выражением
<b>new Object()</b><b>Object.prototype</b><b>var о2 = Object.create(Object.prototype); // о3 подобен объекту, созданному</b><b> // с помощью {} или new Object().</b>Возможность создавать новые объекты с произвольными прототипами (скажем иначе: возможность создавать «наследников» от любых объектов) является мощным инструментом, действие которого можно имитировать в ECMAScript 3 с помощью функции, представленной в примере 6.1. [8]
)
Пример 6.1. Создание нового объекта, наследующего прототип
<b>// inherit() возвращает вновь созданный объект, наследующий свойства </b><b>// объекта-прототипа р. Использует функцию Object.create() из ECMAScript 5, </b><b>// если она определена, иначе используется более старый прием, </b><b>function inherit(р) {</b><b> if (р == null) throw ТуреЕrror(); // р не может быть значением null </b><b> if (Object.create) // Если Object.create() определена...</b><b> return Object.create(p); // использовать ее. </b><b> var t = typeof p; // Иначе выяснить тип и проверить его</b><b> if (t !== "object" && t !== "function") throw ТуреЕrror(); </b><b> function f() {}; // Определить фиктивный конструктор,</b><b> f.prototype = p; // Записать в его свойство prototype</b><b> // ссылку на объект р.</b><b> return new f(); // Использовать f() для создания</b><b> // "наследника" объекта р.</b><b>}</b>Реализация функции
<b>inherit()</b><b>inherit()</b><b>Object.create()</b><b>Object.сreate().</b><b>inherit()</b>Функцию
<b>inherit()</b><b>var о = { х: "не изменяйте это значение" };</b><b>library_function(inherit(o)); // Защита объекта о от непреднамеренного изменения</b>Чтобы понять принцип действия этого приема, необходимо знать, как производится чтение и запись значений свойств объектов в языке JavaScript. Об этом рассказывается в следующем разделе.
6.2. Получение и изменение свойств
Получить значение свойства можно с помощью операторов точки (
<b>.</b><b>[ ]</b><b>var author = book.author; // Получить свойство "author" объекта book.</b><b>var name = author.surname // Получить свойство "surname" объекта author.</b>