我试图从另一个成员函数调用成员函数 - 并且失败了。我认为这很容易找到,但经过10分钟的搜索,我找不到这里的错误。
在下面的代码中(是的,我知道pausecomp是一个很大的禁忌,我只是试图对抗可能的竞争条件):
class LayoutWorker {
/*
Specific events handlers.
e is the object sent by the client. See events.layout for object definitions.
*/
handlers = {
textadd: function (e) {
for (var ind=0; ind<10; ind++)
{
console.log("entering textadd = " + e);
// Do the work and call the client back if needed. You can pass to the client any object.
e.text += " -- Hello back from the worker!";
postClientMessage(e);
this.pausecomp(4000);
}
},
urgent: function (e) {
for (var ind=0; ind<10; ind++)
{
console.log("entering urgent = " + e);
// Do the work and call the client back if needed. You can pass to the client any object.
e.text += " -- Hello back from the worker!";
postClientMessage(e);
this.pausecomp(1000);
}
}
};
handleEvent(e) {
console.log("entering handleEvent = " + e);
// Call the specific handler.
this.handlers[e.id](e);
}
pausecomp(millis : number) : void
{
var date = new Date();
var curDate = new Date();
while(curDate - date < millis)
curDate = new Date();
}
}
当我运行上述内容时,我得到: 未捕获的TypeError:Object#没有方法'pausecomp'
我有什么不对?
谢谢 - 戴夫
答案 0 :(得分:7)
在您的示例中,this
指的是handler
的功能。您还可以使用lambda表达式(() =>
)或实例函数(foo() {}
)。
如果您使用的是lambda,this
应该引用MyClass
。以下是定义类实例函数的一些选项:http://bit.ly/1ep5dMk
因为handlers
是一个单独的类,它有自己的成员,所以它不能引用LayoutWorker - 除非你使用lambda。
你有3个选择:
LayoutWorker
某处pausecomp
方法声明为public
和static
,并使用LayoutWorker.pausecomp(arg)
进行通话。我创建了3个提到的选项的概述: http://bit.ly/1kOeWtS
一些建议:
定义处理程序接口和/或单独的类,以更清晰地查看类模型。这有助于理解this
无法引用LayoutWorker。
答案 1 :(得分:2)
在handlers
对象中,this
引用handlers
,而不是类实例。
缩减版:
class MyClass {
handlers = {
name: 'handlers',
foo() {
console.log(this.name);
}
}
name = 'MyClass';
}
var x = new MyClass();
x.handlers['foo'](); // Prints 'handlers', not 'MyClass';
我的建议是将类实例作为附加参数传递给处理函数,或者甚至更好地完全重构这个模式。正如所写的那样,它确实没有意义 - 你正在为类的每个实例创建一个新的handlers
对象,即使它们属于原型(因为它们不包含实例数据)。