2013-05-16 2 views
0

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

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

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

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

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

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

ответ

0

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

+0

Хорошим примером назначения свойств значения прототипа, которые могут быть назначены, является установка по умолчанию: Man.property.hands = 2 Все экземпляры Человек и его подклассы будут иметь 2 руки, но вы можете изменить его для экземпляра JerryHandy, у которого была небольшая авария с бензопилой. – HMR

0

Вы копируя родительские определенные переменные в ребенке с помощью Parent.call (это) или Parent.apply

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

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

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

Basic поведение прототипа:

Prototypical inheritance - writing up Хорошая ссылка работы с конструктором paramete rs, но для применения вам необходимо реализовать _init и change goog.base: How to "properly" create a custom object in JavaScript?

Смежные вопросы