在javascript中,什么';实例函数和函数类型的实例变量之间的区别是什么?

在javascript中,什么';实例函数和函数类型的实例变量之间的区别是什么?,javascript,function,this,bind,Javascript,Function,This,Bind,我知道其中一个区别是Function类型的实例变量自动绑定到类。例如: 类狗{ 声音='woof' 树皮(){ console.log(这个) } boundBark=()=>{ console.log(这个) } } const fido=新狗() fido.bark()//汪汪 fido.boundBark()//汪汪 常树皮 树皮()//未定义 const boundBark=fido.boundBark boundBark()//woof您可以检查这些方法对狗的作用。prototype

我知道其中一个区别是Function类型的实例变量自动绑定到类。例如:

类狗{
声音='woof'
树皮(){
console.log(这个)
}
boundBark=()=>{
console.log(这个)
}
}
const fido=新狗()
fido.bark()//汪汪
fido.boundBark()//汪汪
常树皮
树皮()//未定义
const boundBark=fido.boundBark

boundBark()//woof
您可以检查这些方法对
狗的作用。prototype
对象:

方法定义:

类狗{
树皮(){
log(this)/*this*引用实际实例
}
}
console.log(Dog.prototype.bark);//功能树皮
:

类狗{
树皮=()=>{
console.log(this);//另外,*this*引用实际实例
}
}
console.log(Dog.prototype.bark);//未定义
在第一种情况下,您在类原型中定义一个函数,而在后一种情况下,您在“构造函数时间”在实例中定义变量,就像在任何其他变量中一样

后者与执行以下操作相同:

类狗{
构造函数(){
this.bark=()=>{
//这就是为什么*这个*实际上是可用的
//并参考实际情况
console.log(this);
}
/*已定义构造函数的其余部分*/
}
}
console.log(Dog.prototype.bark);//未定义

请记住,
ECMAs
标准中仍然没有引入
Public类字段
s,因此许多JS环境无法支持它们,您应该使用一些工具,如Babel,以实现后端兼容性。由于这个原因,某些行为仍然依赖于应用程序(如定义优先级)。

调用箭头函数不会建立
绑定。
bark
是一种存在于
Dog
原型上并在所有实例之间共享的方法
boundBark
是一个实例属性,它包含一个箭头函数,每个实例都有一个。“function类型的实例变量自动绑定到类”如果“instance variable”这里是自己的属性,则仅当该方法直接在类中用箭头函数定义时才是如此。@Pointy,我认为你的解释不准确。arrow函数是唯一一个实际保留此绑定的函数。@Tim no,Pointy完全正确。有关更详细的说明,请参阅,但非箭头函数将在调用时确定此的值。箭头函数不是这样的-调用它们不会改变
这一点。