使用Google Closure继承

时间:2012-06-25 12:38:01

标签: javascript inheritance google-closure

我有一个名为'baseScreen'的基类,如下所示:

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');
};
如果我将baseScreen加载为

,则在onLoad

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并在第4行打印时奇怪地console.log(this)的行上抛出错误window对象而不是baseScreenregisterScreen对象。

我的代码有什么问题?我是否需要覆盖load,在我的派生类中调整大小? (试过这个,但失败了)或其他任何问题?

2 个答案:

答案 0 :(得分:4)

或者,您也可以将@ felix-kling提及的呼叫替换为:

goog.base(this);

完全相同。

关于goog.base的一个注释,来自docs:

  

如果从构造函数调用它,则会使用参数1-N调用超类构造函数。如果从原型方法调用此方法,则必须将方法的名称作为第二个参数传递给此函数。如果不这样做,您将收到运行时错误。

另见:

答案 1 :(得分:2)

您必须在当前baseScreen实例中调用registerScreen

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

否则,您的函数调用等同于digient.casino.ui.baseScreen(),因此this引用全局对象window