Uncaught TypeError: this.method is not a function - Node js class export

Uncaught TypeError: this.method is not a function - Node js class export

我是 node.js 的新手,我想申请一个 class。我使用 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes 作为参考。但是,当我这样做时:

// talker.js
class Talker {
    talk(msg) {
        console.log(this.say(msg))
        var t = setTimeout(this.talk, 5000, 'hello again');
    }
    say(msg) {
        return msg
    }
}
export default Talker

// app.js
import Talker from './taker.js'
const talker = new Talker()
talker.talk('hello')

我得到:

talker.js:4 Uncaught TypeError: this.say is not a function

应该说 app.js 是 electron.js 渲染器进程,它使用 rollup.js

捆绑

知道为什么会这样吗?

更新: 对不起,我在输入伪代码时忘记添加一行。当我用回调调用 setTimeout 时,它实际上发生了。我更新了代码。

您正在失去 this 对您的方法的绑定。

由此变化:

setTimeout(this.talk, 5000, 'hello again');

对此:

setTimeout(this.talk.bind(this), 5000, 'hello again');

当您将 this.talk 作为函数参数传递时,它接受 this 并查找方法 talk 并传递对该函数的引用。但是,它只传递对该函数的引用。不再与您在 this 中拥有的对象有任何关联。 .bind() 允许您将引用传递给一个微小的存根函数,该函数将跟踪 this 并将您的方法称为 this.say(),而不仅仅是 say().

如果你只是这样做,你会看到同样的事情:

const talker = new Talker();'

const fn = talker.say;
fn();

这会产生同样的问题,因为将方法分配给 fn 根本不需要与 talker 关联。它只是一个函数引用,与对象没有任何关联。事实上:

talker.say === Talker.prototype.say

.bind() 所做的是创建一个小的存根函数,它将保存对象值,然后使用该对象调用您的方法。