我是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使用回调调用时,它实际上发生了。我已经更新了代码。
setTimeout
您正在失去方法的束缚this。
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()。
this.talk
talk
.bind()
this.say()
say()
如果您只是这样做,则可以看到相同的内容:
const talker = new Talker();' const fn = talker.say; fn();
这将产生相同的问题,因为将方法分配给fn根本没有关联talker。它只是一个函数引用,与对象没有任何关联。事实上:
fn
talker
talker.say === Talker.prototype.say
是什么.bind()做的是创建一个小存根功能,将保存对象的值,然后将使用该对象调用你的方法。