You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中调用类属性存储的回调:解决this指向错误问题

问题解决:WebSocket回调中this指向错误导致无法访问类私有成员

你的推测完全正确:当WebSocket触发onopen事件时,回调函数onOpen里的this指向的是WebSocket实例,而非你的Connection类实例,所以会报错找不到私有成员#log_text。以下是几种实用的解决方法:

方法1:用bind绑定this到Connection实例

修改构造函数中的回调赋值,通过bind将onOpen的this固定为当前Connection对象:

constructor(url, log_callback)
{
    this.#web_socket = new WebSocket(url);
    this.#web_socket.binaryType = "arraybuffer";
    // 绑定this到当前Connection实例
    this.#web_socket.onopen = this.onOpen.bind(this);

    this.#log_text = log_callback;
}

bind会返回一个新函数,调用时this始终指向传入的Connection实例,类似C++中绑定成员函数到对象的逻辑。

方法2:用箭头函数包装回调

利用箭头函数没有独立this的特性,让它继承构造函数上下文的this:

constructor(url, log_callback)
{
    this.#web_socket = new WebSocket(url);
    this.#web_socket.binaryType = "arraybuffer";
    // 箭头函数的this就是构造函数里的Connection实例
    this.#web_socket.onopen = (event) => this.onOpen(event);

    this.#log_text = log_callback;
}

这种写法更简洁,不需要额外处理函数绑定。

方法3:用箭头函数定义类方法

直接将onOpen定义为箭头函数类型的实例属性,永久绑定this到类实例:

class Connection
{
    #web_socket = 0;
    #log_text = null;

    constructor(url, log_callback)
    {
        this.#web_socket = new WebSocket(url);
        this.#web_socket.binaryType = "arraybuffer";
        this.#web_socket.onopen = this.onOpen;

        this.#log_text = log_callback;
    }

    // 箭头函数方法,this固定为Connection实例
    onOpen = (event) => {
        this.#log_text('Connection opened.');
    }
}

这种方式不需要在构造函数里做额外绑定,代码结构更清晰。

内容的提问来源于stack exchange,提问作者Dams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 05:10:32