Typescript 如何从另一个函数调用成员函数?
我试图从另一个成员函数调用一个成员函数,但失败了。我想这很容易找到,但经过10分钟的搜索,我找不到这里有什么问题 在下面的代码中,是的,我知道pausecomp是一个很大的“否”,我只是尝试针对可能的比赛条件进行测试:Typescript 如何从另一个函数调用成员函数?,typescript,this,Typescript,This,我试图从另一个成员函数调用一个成员函数,但失败了。我想这很容易找到,但经过10分钟的搜索,我找不到这里有什么问题 在下面的代码中,是的,我知道pausecomp是一个很大的“否”,我只是尝试针对可能的比赛条件进行测试: class LayoutWorker { /* Specific events handlers. e is the object sent by the client. See events.layout for object definitions
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:对象没有方法“pausecomp”
我怎么了
谢谢-dave在handlers对象中,这指的是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对象,即使它们属于原型,因为它们不包含实例数据。在您的示例中,这指的是handler的函数。还可以使用lambda表达式=>或实例函数foo{}
如果您使用的是lambda,则应该引用MyClass。以下是定义类实例函数的一些选项:
因为handlers是一个单独的类,其成员是自己的,所以它不能引用LayoutWorker,除非您使用lambda
您有3种选择:
在某处传递LayoutWorker的实例
将pausecomp方法声明为public和static,并使用LayoutWorker.pausecomparg调用。
使用lambda参见类型脚本示例
我对提到的3个选项做了一点概述:
一些建议:
定义处理程序接口和/或单独的类,以更清楚地查看类模型。这有助于理解这不能引用LayoutWorker。检查事件处理程序中的值。我想你会感到惊讶的。这不是你所想的。@x0n不幸的是,我还不能让Chrome或WebStorm在我的工作线程中的断点上中断。一旦我开始工作,我就能做到。真的吗?您可以通过在处理程序中放置javascript关键字调试器来强制执行它。@我尝试过的xOn-两者都不起作用。我认为他们都有中断工作线程的问题。要在TypeScript中更好地理解这一点: