“this”在 JavaScript 类方法中未定义

2022-08-30 05:28:49

我是JavaScript的新手。就我真正完成的所有事情而言,它是新的,它调整了现有的代码并编写了一小段jQuery。

现在我正在尝试编写一个包含属性和方法的“类”,但是我在方法上遇到了麻烦。我的代码:

function Request(destination, stay_open) {
    this.state = "ready";
    this.xhr = null;
    this.destination = destination;
    this.stay_open = stay_open;

    this.open = function(data) {
        this.xhr = $.ajax({
            url: destination,
            success: this.handle_response,
            error: this.handle_failure,
            timeout: 100000000,
            data: data,
            dataType: 'json',
        });
    };

    /* snip... */

}

Request.prototype.start = function() {
    if( this.stay_open == true ) {
        this.open({msg: 'listen'});
    } else {

    }
};
//all console.log's omitted

问题是,in 是未定义的,因此 if 语句的计算结果为 false。我在这里做错了什么?Request.prototype.startthis


答案 1

我只是想指出,有时会发生这种错误,因为函数已被用作高阶函数(作为参数传递),然后范围丢失了。在这种情况下,我建议将此类函数绑定到 。例如:thisthis

this.myFunction.bind(this);

答案 2

如何调用 start 函数?

这应该有效(是关键)

var o = new Request(destination, stay_open);
o.start();

如果直接称它为 ,将引用全局上下文(在浏览器中)。Request.prototype.start()thiswindow

此外,如果未定义,则会导致错误。if 表达式的计算结果不为 false。this

更新:对象不是基于声明设置的,而是通过调用设置的。这意味着,如果将函数属性分配给变量,如 并调用 ,则 start 内部不再引用 。这就是当您执行.要使其正常工作,请改为执行以下操作:thisx = o.startx()thisosetTimeout

 var o = new Request(...);
 setTimeout(function() { o.start(); }, 1000);