Typescript 如何从另一个函数调用成员函数?

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

我试图从另一个成员函数调用一个成员函数,但失败了。我想这很容易找到,但经过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:对象没有方法“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中更好地理解这一点: