0x800a01b6 - JavaScript运行时错误:对象不支持属性或方法

时间:2014-05-27 07:35:04

标签: typescript

    interface IMySocks {
        start(): void;
    }

    declare var $;

    class MySocks implements IMySocks {

        private address: string;
        private protocols = [];
        private mySock: WebSocket;
start() {
        this.mySock = new WebSocket(this.address, this.protocols);
        this.mySock.onclose = this.onclose;
        this.mySock.onopen = this.onopen;
        this.mySock.onerror = this.onerror;
        this.mySock.onmessage = this.onmessage;
    }

private onopen(): void {
        this.sendIt();
        console.debug("OPEN");
    }

private sendIt() {
.....}

var my:IMySocks = new MySocks(); my.start();

所以这样的课程在主题中出现错误。 Intellisense和编译在typescript文件中没有发现错误。我正在使用VS2012 Ultimate update 2和typescript 1.0。怎么了?

当我调用this.sendIt();

时会出现问题

3 个答案:

答案 0 :(得分:2)

与C#等其他编程语言不同,它会将this上下文保留为您想要的内容,但JavaScript中的this上下文略有不同。有关详细信息,请阅读this

除了创建用于捕获this的闭包,您还可以考虑使用ES5中提供的bind更为典型的JavaScript方法(Mozilla docs / MSDN docs):

this.mySock.onclose = this.onclose.bind(this);

bind返回绑定到提供的this上下文(或您想要的任何上下文)的函数。该函数(onclose)将在运行时使用适当的上下文集调用。

答案 1 :(得分:1)

问题在于this在这种情况下并未指向MySocks的实例,而是指向WebSocket的实例。

如果您希望this引用有效,可以执行以下操作

this.mySock.onopen = () => { this.onopen(); };

答案 2 :(得分:1)

如果您计划传递函数,则需要使用lambda。无论是丹尼斯推荐的还是:

private onopen =  () => {
        this.sendIt();
        console.debug("OPEN");
    }

由于这个原因,请参阅:https://www.youtube.com/watch?v=tvocUcbCupA&hd=1这是因为如果您只是在不使用lambda的情况下传递成员函数(并让其他人调用它),则调用上下文会丢失。