JS解绑this后访问私有方法出现异常错误信息的原因咨询
为什么访问未绑定this的类私有方法会提示读取'TestClass'而非私有方法名?
核心原因:私有方法与公共方法的访问机制完全不同
1. 公共方法的访问逻辑
当你调用this.publicMethod()时,本质是普通属性访问操作:JS引擎直接尝试读取this对象上名为publicMethod的属性。当this被置为undefined时,自然会抛出Cannot read properties of undefined (reading 'publicMethod')——这和直接执行undefined.publicMethod()的报错逻辑完全一致。
2. 私有方法的访问逻辑
私有方法(#privateMethod)是ES6类的私有槽位成员,它的访问规则和公共属性有着本质区别:
- 私有成员不属于
this对象的普通属性集合,而是绑定到类的内部关联机制中; - 当执行
this.#privateMethod()时,JS引擎会先完成两步关键验证:- 确认当前执行的方法属于
TestClass类(私有成员仅允许在类内部访问); - 验证
this确实是TestClass的实例(或能关联到该类的对象)。
- 确认当前执行的方法属于
当this为undefined时,引擎在第二步验证中,会尝试读取this关联的TestClass标识,但undefined没有任何属性,因此抛出Cannot read properties of undefined (reading 'TestClass')——这个报错是在类归属验证阶段产生的,还没到查找#privateMethod的步骤。
关于你的疑惑:JS如何知道函数与TestClass关联?
类的所有方法(包括公共和私有方法)在定义时,都会通过内部机制绑定到所属类:
- 类的原型方法(比如
publicWithPrivate)会拥有一个内部[[HomeObject]]槽位,指向TestClass.prototype,而原型又直接关联TestClass本身; - 哪怕你把方法从实例上提取出来(
obj.publicWithPrivate),这个方法的内部关联信息不会丢失,JS引擎依然能通过[[HomeObject]]追溯到它所属的TestClass。
所以即便this被置为undefined,引擎依然能识别当前执行的方法属于TestClass,在验证this是否为该类实例时,就会因this是undefined而抛出关于TestClass的错误。
代码执行流程拆解
以deprivedMethod2()的执行为例:
- 调用
deprivedMethod2(),执行func()即obj.publicWithPrivate(),此时函数内的this因失去绑定变为undefined; - 执行
this.#privateMethod(),引擎启动私有成员访问验证流程; - 引擎尝试确认
this是否是TestClass的实例,需要读取this关联的类标识,但this是undefined,因此抛出Cannot read properties of undefined (reading 'TestClass')。
内容的提问来源于stack exchange,提问作者박한영
相关产品推荐
相关产品推荐

