为什么类构造函数内调用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
相关产品推荐
相关产品推荐

