Наследование
В JavaScript наследование реализуется путем ассоциирования объектов- прототипов с функциями-конструкторами, при этом используется свойство prototype конструктора. Другими словами, если требуется создать тип объектов, наследующий свойства и методы некоторого объекта, необходимо присвоить свойству prototype функции-конструктора этот объект. Далее приведен пример, демонстрирующий принцип реализации наследования в JavaScript.
function Object_1(x)
{
this.x = x || 0;
}
function Object_2(x, y)
{
this.parent = Object_1;
this.parent(x); // вызов конструктора Object_1
// для инициализации свойств
// объекта-прототипа
this.y = y || 0;
}
Object_2.prototype = new Object_1; // устанавливаем для
// Object_2 объект-прототип var obj = new Object_2(10, 20);
// создаем объект типа
// Object_2, который
// наследует свойство x,
// определяемое в Object_1
В этом примере путем определения функций-конструкторов специфици руются два типа объектов: Object_1 и Object_2. Затем создается простая иерархия — Object_2 наследует свойства Object_1.
В примере существует один немаловажный момент, который необходимо отметить особо. В конструктор Object_1 передается параметр x, значение которого служит для инициализации свойств объектов типа Object_1. Скорее всего, нам захочется иметь возможность прозрачной инициализации свойств, наследуемых Object_2 от Object_1 при создании объектов типа Object_2. Поэтому логично передавать параметр x в конструктор Object_2, а затем вызывать конструктор Object_1 с этим параметром. Обратите внимание на то, как это делается. Сначала некоторому свойству объекта (в примере это свойство parent, но имя свойства может быть любым) присваивается ссылка на конструктор Object_1, а затем производится вызов этого конструктора как метода Object_2 через значение этого свойства. Зачем? Дело в том, что конструктор Object_1 определяет свойства или методы создаваемого объекта (в нашем случае это свойство x) через ссылку this на этот объект. А ссылка this передается в функцию, если она является методом объекта. Вызывая конструктор Object_1 как метод Object_2, мы обеспечиваем передачу в Object_1 через this-ссылки на тот же объект, с которым работаем в конструкторе Object_2. Важно не прерывать цепочку вызовов конструкторов, если мы не хотим инициализации некоторых свойств объектов параметрами по умолчанию.
Do'stlaringiz bilan baham: |