Google Closure Library наследует свойства

Я экспериментирую с библиотекой закрытия Google и, в частности, с ее методом «наследования».

У меня есть один вопрос. Когда я расширяю базовый класс, если я не устанавливаю свойства базового класса в его конструкторе, все дочерние элементы в конечном итоге разделяют свойства, например, если я добавляю элементы в массив, массив продолжает увеличиваться.

Может ли кто-нибудь объяснить, почему мне нужно установить свойства в конструкторе?

Вот мой пример, если закомментировать "this.list = [9,8,7];" в конструкторе «Лицо» дети совместно используют список лиц и продолжают добавлять к нему.

http://jsbin.com/imujoy/1/edit

Спасибо за любую помощь.


person aholla    schedule 16.05.2013    source источник


Ответы (2)


Когда вы ссылаетесь на «this.list» из дочернего элемента, он сначала просматривает сам объект, чтобы найти это свойство. Когда он не может его найти, он смотрит на свой прототип и находит массив «список». Однако этот список является ссылкой на тот же список, который вы создали в прототипе Person. Если вы назначаете новый «this.list» в конструкторе, вы просто назначаете свойство объекту, а не прототипу. Вообще говоря, вам не следует назначать непримитивные типы (массивы, объекты) в прототипе, если вы собираетесь использовать модель наследования, потому что дочерние элементы будут использовать одну и ту же ссылку.

person ne8il    schedule 19.05.2013
comment
Хорошим примером назначения свойств прототипа, которые могут быть переназначены, является установка значения по умолчанию: Man.property.hands=2 Все экземпляры Man и его подклассы будут иметь 2 руки, но вы можете изменить его для экземпляра JerryHandy, у которого было небольшая авария с бензопилой. - person HMR; 26.05.2013

Вы копируете определенные родительские переменные в дочернем, используя Parent.call(this) или Parent.apply

function Child(){
  Parent.apply(this,arguments);
}
goog.inherits(Child, Parent);

список становится свойством любого дочернего экземпляра, если он определен в родительском объекте следующим образом:

function Parent(){
  this.list=[];
}

Базовое поведение прототипа:

Прототипное наследование - запись Хороший справочник по параметрам конструктора, но для применения у вас есть реализовать _init и изменить goog.base: Как правильно создать пользовательский объект в JavaScript?

person HMR    schedule 26.05.2013