这很难解释,但我已经研究这个问题好几天了。我将一个 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/