Wiki-учебник по веб-технологиям: JavaScript/СвойстваОбъекта ...

Главная | |

Свойства объекта

Оглавление документа

В этом разделе рассматривается наследование объектами свойств других объектов в цепи прототипов и что происходит, если вы добавляете свойство во время прогона программы.

1. Наследование свойств


Предположим, вы создаёте объект mark как экземпляр объекта WorkerBee, следующим оператором:

mark = new WorkerBee;


Когда JavaScript встречает оператор new, он создаёт новый общий родовой/generic объект и передаёт этот новый объект как значение ключевого слова this в конструктор функции WorkerBee. Конструктор функции явно устанавливает значение свойства projects. Он также устанавливает значение внутреннего свойства proto в значение WorkerBee.prototype. (Имя этого свойства содержит два символа подчёркивания в начале и два – в конце.)
proto определяет цепь прототипов, используемую для возвращения значений свойств. После того как эти свойства установлены, JavaScript возвращает новый объект, и оператор присвоения устанавливает переменную mark в этот объект.

Этот процесс не помещает явно значения в объект mark (локальные значения) для свойств, которые mark наследует от цепи прототипов. Когда вы запрашиваете значение свойства, JavaScript сначала проверяет, существует ли значение в этом объекте. Если существует, это значение возвращается. Если локального значения нет, JavaScript проверяет цепь прототипов (используя свойство proto). Если объект в цепи прототипов имеет значение для этого свойства, это значение возвращается. Если такое свойство не найдено, JavaScript сообщает, что объект не имеет этого свойства. Таким образом, объект mark имеет следующие свойства и значения:

mark.name = "";
mark.dept = "general";
mark.projects = [];


Объект mark наследует значения свойств name и dept из прототипичного объекта в mark.proto. Оно присваивается локальному значению свойства projects конструктором WorkerBee. Это даёт вам наследование свойств и их значений в JavaScript. Некоторые тонкости этого процесса обсуждаются в разделе Повторное Рассмотрение Наследования Свойств.

Поскольку эти конструкторы не позволяют вводить значения, специфичные для экземпляра, эта информация является общей. Значения свойств являются значениями по умолчанию, используемыми всеми новыми объектами, создаваемыми на основе WorkerBee. Вы можете, разумеется, изменять значение любого из этих свойств. Так, вы можете ввести в mark специфическую информацию:

mark.name = "Doe, Mark";
mark.dept = "admin";
mark.projects = ["navigator"];


2. Добавление свойств


В JavaScript вы можете добавлять свойства любому объекту на этапе прогона программы. Отсутствует ограничение на использование только свойств, предоставленных конструктором функции. Чтобы добавить свойство отдельному объекту, вы присваиваете значение этому свойству объекта таким образом:

mark.bonus = 3000;


Теперь объект mark имеет свойство bonus, но другие потомки WorkerBee этого свойства не имеют.

Если вы добавляете новое свойство объекту, который используется как прототип конструктора функции, вы добавляете это свойство всем объектам, наследующим свойства от этого прототипа. Например, вы можете добавить свойство specialty всем employee с помощью следующего оператора:

Employee.prototype.specialty = "none";


Когда JavaScript выполнит этот оператор, объект mark также получит свойство specialty со значением “none”. На рисунке показано эффект от добавления этого свойства прототипу Employee и последующего переопределения этого свойства для прототипа Engineer.

Добавление свойств