You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么类构造函数内调用change()未定义,是否需通过__proto__链路访问?

JavaScript类构造函数内调用实例方法报错问题解答

这个问题的核心是混淆了作用域链查找和原型链查找的触发规则:

  • 直接裸写change()调用时,JS只会沿着当前上下文的作用域链查找名为change的变量,不会触发任何原型链查找逻辑。你定义在Person类里的change是挂载在Person.prototype上的实例方法,不属于构造函数作用域内的变量,所以直接调用自然会报未定义。
  • 原型链查找只有在访问对象属性的时候才会触发,也就是你需要用this.change()的形式调用。此时JS会先检查当前实例自身有没有change属性,找不到就会沿着this.__proto__(也就是Person.prototype)向上查找,就能找到你定义的类方法了。

关于后续全局调用change()成功的原因:
你后续给Object.prototype挂载了change方法,全局环境下裸写函数调用等价于调用window对象的对应方法,window是Object的实例,会沿着自身原型链查找到Object.prototype上的change方法,因此可以正常执行。


你可以修改构造函数内的调用方式验证逻辑:

class Person {
  constructor() {
    this.change() // 此时可以正常调用类内定义的change方法
  }
  change() {
    console.log(this)
  }
}
var p = new Person()

内容的提问来源于stack exchange,提问作者conner brain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:36:06