JavaScript类中箭头函数类字段的this为何不会随方法传递丢失?
问题1:普通方法丢失this绑定的认知是否正确?
你的认知完全正确。
类中声明的普通方法(比如getName)是定义在类的原型对象Person.prototype上的,所有实例共享该方法。这类方法的this是动态绑定的,由实际调用时的执行上下文决定:
- 用
p1.getName()的形式调用时,this指向.前面的p1实例; - 把方法赋值给变量后直接调用
printName(),属于无上下文的独立调用,而类内部默认运行在严格模式,独立调用时this值为undefined,因此访问this.name会抛出错误。
问题2:箭头函数类字段的this为什么能固定指向实例?
你之前的认知遗漏了「类实例字段的初始化时机和作用域」这一点:
用=赋值的类实例字段,本质上是在每个实例的构造函数执行阶段,直接赋值给当前实例对象自身的属性,并不是定义在原型上。
你写的getAge = () => this.age,等效于在构造函数里写如下代码:
class Person { constructor(name, age) { this.name = name; this.age = age; // 等效的箭头函数赋值逻辑 this.getAge = () => this.age; } }
箭头函数本身没有自己的this,会从外层词法作用域捕获this。而这里箭头函数的外层作用域就是构造函数的作用域,构造函数执行时的this就是当前正在创建的实例对象,因此这个箭头函数捕获的this永远指向当前实例,且箭头函数的this一旦捕获就无法被修改,不管之后你把这个函数赋值给什么变量、用什么方式调用,this都始终指向最初绑定的实例。
两种写法的核心差异总结
getName:原型方法,所有实例共享,this动态绑定,随调用方式变化getAge:实例自身属性,每个实例都会创建独立的函数,this在实例创建时就固定绑定到当前实例,不会随调用方式变化
内容的提问来源于stack exchange,提问作者Enthalpy127
相关产品推荐
相关产品推荐

