2012-06-25 1 views
1

У меня есть базовый класс с именем 'baseScreen' следующим образом:Наследование с помощью Google Closure

digient.casino.ui.baseScreen = function() { 
    goog.debug.Logger.getLogger('demo').info('baseScreen'); 
    this.background        = goog.dom.createDom('div', {'class': 'backgroundHolder'}, ''); 
    console.log(this); 
} 

digient.casino.ui.baseScreen.background   = null; 

digient.casino.ui.baseScreen.prototype.load  = function() { 
    var self         = this; 
    goog.debug.Logger.getLogger('demo').info('baseScreen : load'); 
    goog.dom.appendChild(document.body, this.background); 
    <!-- screen setup code goes here --> 
}; 

digient.casino.ui.baseScreen.prototype.resize = function(newSize) { 
    goog.debug.Logger.getLogger('demo').info('baseScreen : resize'); 
}; 

в onLoad, если я загружаю baseScreen в

var sc = new digient.casino.ui.baseScreen(); 
sc.load(); 

его работает отлично.

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

digient.casino.ui.registerScreen = function() {              
    goog.debug.Logger.getLogger('demo').info('registerScreen');          
    digient.casino.ui.baseScreen.call(); 
};                         
goog.inherits(digient.casino.ui.registerScreen, digient.casino.ui.baseScreen); 

Когда я пытаюсь загрузить объект registerScreen, его бросает ошибку на линии, где я пытаюсь добавить this.background к document.body и удачливый console.log(this) в строке 4 отпечатки window объект вместо baseScreen или registerScreen объект.

Что не так с моим кодом? Нужно ли переопределять нагрузку, изменять размер в моем производном классе? (пробовал это, но провал) или любую другую проблему?

+0

См: [Почему 'goog.base (это)' необходимо в дополнение к 'goog.inherits () '?] (http://stackoverflow.com/questions/11122608/why-is-goog-basethis-necessary-in-addition-to-goog-inherits) –

ответ

2

Вы должны вызвать baseScreen будет текущий registerScreen экземпляр:

digient.casino.ui.baseScreen.call(this); 

В противном случае, ваш вызов функции эквивалентен digient.casino.ui.baseScreen(), следовательно, this относится к глобальному объекту window.

4

В качестве альтернативы, можно также заменить упоминаемый @ ФЕЛИКС-KLING с вызова:

goog.base(this); 

, который делает ту же самую вещь.

Одно замечание о goog.base, из документации:

Если это вызывается из конструктора, то это вызывает конструктор суперкласса с аргументами 1-N. Если это вызывается из метода прототипа, вы должны передать имя метода в качестве второго аргумента этой функции. Если вы этого не сделаете, вы получите ошибку времени выполнения.

Смотри также: