JavaScript 类扩展 : calling base class-function from child-class function : seem to be calling static method

标签 javascript inheritance

这很难解释,但我已经研究这个问题好几天了。我将一个 Javascript“类”“扩展”到另一个,但从子类方法调用基类方法无法正常工作。看起来基类方法“充当”静态方法:当从子类方法调用基类方法时,子类中定义的属性以某种方式具有其默认值。

为了保持简单,我没有包含我的复杂代码,而是创建了一个简单的示例来说明我正在做的事情:

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 的缺点之一,而我实际上在这里调用了“静态”方法。在这里,我们将非常感谢您的帮助。希望我在这里想做什么很清楚,因为我发现用语言表达它很复杂。预先非常感谢!

最佳答案

这行代码发生了什么:

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 没有类),我几年前写过:Simple, Efficient Supercalls in JavaScript它使用类似“类”的术语,但实际上不应该这样做(它只是帮助方法,使连接原型(prototype)继承的层次结构变得更容易),并且它早于 ECMAScript 5(JavaScript 的最新版本),它提供了一些适用的功能。所以我需要更新它,但它可能对你有用。

关于JavaScript 类扩展 : calling base class-function from child-class function : seem to be calling static method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8928986/

相关文章:

javascript - visjs 加载图表完成后获取回调

javascript - 我正在尝试了解不显眼的 Javascript 的最佳实践。使用观察者的推荐且有效的方法是什么?

python - 在 python 中重写 tuple.__len__

ios - 如何在初始化期间将值从子类传递到父类(super class)

java - 如何让子类使用父类的 protected 方法?

javascript - 类型错误 : Cannot read property 'user_mainValue' of undefined

javascript - 编码 JSON 并存储在 MYSQL 中的正确方法?

javascript - 如何使用 JavaScript 找到出现次数最多的数字?

swift - xcode4.2 - 从外部类快速访问 Viewcontrollers 标签

c# - 继承链中类的良好命名约定是什么?