这很难解释,但我已经好几天了。我正在“扩展”一个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的一个缺点,我实际上在这里称之为“静态”方法。这里的帮助将非常感激。希望很清楚我在这里要做的是什么,因为我觉得把它放在文字中很复杂。非常感谢提前!
答案 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)提供了一些适用的功能。所以我需要更新它,但它可能对你有用。