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()
所做的是创建一个小的存根函数,它将保存对象值,然后使用该对象调用您的方法。
我是 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()
所做的是创建一个小的存根函数,它将保存对象值,然后使用该对象调用您的方法。