在阅读为什么ES6课程方法不会自动绑定"这个"对于该方法,我看到答案说"原型方法不会在提取上绑定"但这对我来说没有任何意义。什么"绑定提取"意思?
调用函数时
obj.func()
"对提取的约束意味着"?
我发现相关的文章是:
https://esdiscuss.org/topic/why-are-es6-class-methods-not-automatically-bound-to-the-instance - 这是生成我的问题的文章。搜索"我们仍然可以在提取上绑定方法"
Why aren't methods of an object created with class bound to it in ES6? - 这是Stack Overflow问题和答案,引用了相关文章。
Mozilla MDN web docs on Classes - 奇怪的是,作为示例Javascript类给出的Rectangle示例并没有使用bind()。我猜是因为它非常简单,所以不需要绑定,但是如果它有,它会帮助那些从Java背景来到Javascript的人(比如我自己)
ES6 In Depth: Classes - 关于原型对象的非常好的文章以及class关键字如何是语法糖。
答案 0 :(得分:5)
提取基本上意味着将方法与对象断开连接。您可以在调用方法时执行此操作,而无需将其“链接”到类实例。
class Test {
constructor(r) {
this.r = r;
}
sample() {
console.log(this);
}
}
let t = new Test(1);
t.sample();
let q = t.sample;
q();
因此,在此示例中,当我调用t.sample()
时,它会返回我期望的内容:{ r:1 }
。但是当我设置q = t.sample
然后调用q()
时,我得到了未定义。我已“提取”了我的功能并将其分配给另一个变量。
如果您将该函数用作事件处理程序,则会发生同样的事情。
答案 1 :(得分:0)
想象一下你有一些课程:
tf.data
有人这样做:
class C {
foo() {
console.log(this);
}
}
应该将哪个对象记录到控制台? const c = new C();
const o = {
callback: c.foo // "extract the function"
}
o.callback();
,因为它最初宣布了该方法,或c
,因为我们在呼叫网站上指定的是什么?
JavaScript默认为后者,但您可以通过调用Function.prototype.bind
来实现前者。
也就是说,他们讨论的问题是类方法是否应该在从对象中检索时自动绑定到o
,确保this
始终引用方法最初来自的对象,如与调用者用来进行调用的对象相对。