Javascript类扩展:从子类函数调用基类函数:似乎是调用静态方法

时间:2012-01-19 15:47:52

标签: javascript inheritance

这很难解释,但我已经好几天了。我正在“扩展”一个Javascript“类”到另一个,但从子类方法调用基类方法不能正常工作。看起来好像base-class-method“作用”为静态方法:当从子子类方法调用base-class-method时,子类中定义的属性以某种方式具有默认值。

为了简单起见,我没有包含精心设计的代码,但创建了一个我正在做的简单示例:

function extend(Child, Parent){
    var F = function(){};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.base = Parent.prototype;
}

function BaseClass(){
}

BaseClass.prototype.randomNumber = 0;
BaseClass.prototype.functionA = function(){
     this.randomNumber = 200;
     this.functionB();
}

BaseClass.prototype.functionB = function(){
     alert(this.randomNumber);
     console.info(this);
}

function ChildClass(){

    this.functionB = function(){
         ChildClass.base.functionB();
    };
}

extend(ChildClass, BaseClass); 
var childInstance = new ChildClass();
childInstance.functionA();

我正在使用firebug登录控制台。它输出的“Baseclass”和this.randomNumber以某种方式为0,而在functionA中设置为200。

我正在使用的扩展方法与Yahoo.lang.extend中的方法类似,我也尝试过相同的结果。

我无法弄清楚我是否遗漏了某些内容,或者这只是“扩展”Javascript的一个缺点,我实际上在这里称之为“静态”方法。这里的帮助将非常感激。希望很清楚我在这里要做的是什么,因为我觉得把它放在文字中很复杂。非常感谢提前!

1 个答案:

答案 0 :(得分:5)

在这行代码中会发生什么:

ChildClass.base.functionB();

...是functionB被调用,this指向ChildClass.base。这是因为JavaScript中的this完全由如何调用函数定义,而不是定义它的位置(与许多其他具有该关键字的语言不同)。要在保留this的含义的同时拨打该电话,您需要使用call

ChildClass.base.functionB.call(this);

...在调用期间显式设置this是您传入的任何内容(在本例中为this)。更多:Mythical methods | You must remember this


顺便说一下,如果你对继承层次结构感兴趣并调用父对象(我不会说“类”,JavaScript没有类),我几年前写了这个:{ {3}}它使用“类”类术语,它实际上不应该(它只是辅助方法,使原型继承的层次结构更容易),它早于ECMAScript 5(最新版本的JavaScript)提供了一些适用的功能。所以我需要更新它,但它可能对你有用。