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

时间:2014-04-10 16:49:18

标签: typescript this

我试图从另一个成员函数调用成员函数 - 并且失败了。我认为这很容易找到,但经过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'

我有什么不对?

谢谢 - 戴夫

2 个答案:

答案 0 :(得分:7)

在您的示例中,this指的是handler的功能。您还可以使用lambda表达式(() =>)或实例函数(foo() {})。

如果您使用的是lambda,this应该引用MyClass。以下是定义类实例函数的一些选项:http://bit.ly/1ep5dMk

因为handlers是一个单独的类,它有自己的成员,所以它不能引用LayoutWorker - 除非你使用lambda。

你有3个选择:

  • 传递LayoutWorker某处
  • 的实例
  • pausecomp方法声明为publicstatic,并使用LayoutWorker.pausecomp(arg)进行通话。
  • 使用lambda(参见TypeScript游乐场的示例)

我创建了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对象,即使它们属于原型(因为它们不包含实例数据)。