一尘不染

未捕获的TypeError:this.method不是函数-Node js类导出

node.js

我是node.js的新手,并且我想要求一个类。我已经使用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未捕获的TypeError:this.say不是函数

应该说app.js是electronic.js渲染器进程,并且使用rollup.js捆绑在一起

任何想法为什么会这样?

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


阅读 207

收藏
2020-07-07

共1个答案

一尘不染

您正在失去方法的束缚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()做的是创建一个小存根功能,将保存对象的值,然后将使用该对象调用你的方法。

2020-07-07