Предположим, Вы создаёте объект 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"];