09. Функции. Часть 3. Конструкторы
Чтение и запись свойств объекта
Пусть объект ob создан при помощи конструктора F.
Чтение
![]() |
При чтении свойства ob.p JavaScript сначала проверяет, нет ли свойства p в самом объекте ob. Если нет, свойство p ищется в прототипе, то есть в объекте F.prototype. Таким образом работает наследование на базе прототипа. |
Пример
function F(p)
{
this.p = p;
}
F.prototype.x = 10;
var ob = new F(1);
alert(ob.p); // Равно 1. Свойство p найдено в самом объекте ob
alert(ob.x); // Равно 10. Свойство x найдено в прототипе
alert(ob.y); // Равно undefined. Свойство y нигде не найдено
Смотрите пример «Чтение».
Запись
Если свойство присутствовало в прототипе, оно перекрывается одноименным свойством в объекте (свойство в прототипе становится недоступным). |
Запись работает не симметрично чтению. Когда свойству присваивается значение, JavaScript никогда не обращается к прототипу. Если свойство p есть в самом объекте ob, ему присваивается новое значение. Если свойства p в объекте нет, оно создаётся в самом объекте, и ему присваивается значение (независимо от того, если ли свойство с таким же именем в прототипе). |
Пример
function F(p)
{
this.p = p;
}
F.prototype.x = 10;
var ob = new F(1);
ob.p = 2;
alert(ob.p); // Равно 2. Свойство p найдено в самом объекте ob
ob.x = 100; // Свойство x создается в самом объекте и, тем самым,
// перекрывает одноименное свойство прототипа.
alert(ob.x); // Равно 100. Получено значение свойства x в самом объекте,
// Одноименное свойство прототипа в этом объекте теперь
// недоступно (но остается доступным в других экземплярах
// класса F, поэтому не удаляется сборщиком мусора).
var ob1 = new F(2);
alert(ob1.x); // Равно 10
Смотрите пример «Запись».
Если свойство p создается в объекте, оно переопределяет (или как иногда говорят «затеняет», или «перекрывает») одноименное свойство прототипа.
И этим мы не раз пользовались, создавая метод toString для своих объектов.
Вспомним, все объекты наследуют метод toString от конструктора Object. Понятно, этот метод принадлежит прототипу этого конструктора. Если для какого-то объекта (или класса) мы создаем собственный toString, он перекрывает метод toString конструктора Object только для данного объекта (или класса). Если бы это было не так, все объекты JavaScript получили бы новый метод toString, и это было бы катастрофой.