JavaScript中class创建的实例返回undefined 为何未返回全局'red'?
核心原因有两个,分别对应你遇到的两个异常现象
1. 为什么new foo得到的不是实例,打印oof看不到name属性?
JavaScript的new操作符有固定规则:如果构造函数显式返回了引用类型值(对象、函数、数组等),new会直接返回这个值,抛弃原本创建的类实例。
你在foo的构造函数里显式返回了一个匿名函数,所以oof根本不是foo的实例,就是这个普通匿名函数,打印它自然不会有你预期的实例属性name。
2. 为什么oof()调用报错,和全局color()的表现不一致?
这是因为 class内部默认开启严格模式('use strict'),严格模式对普通函数的this绑定有特殊规则:
- 非严格模式下,普通函数无明确绑定直接调用时,
this默认指向全局对象globalThis,所以你全局定义的color()调用时能拿到全局的name值red。 - 严格模式下,普通函数无明确绑定直接调用时,
this的值为undefined,你在class构造函数内定义的匿名函数属于严格模式作用域下创建的函数,内部默认遵循严格模式规则,调用oof()时访问undefined.name自然会抛出"不能读取undefined的name属性"的错误。
验证方案
你可以尝试给oof手动绑定全局对象再调用,就能得到你预期的red:
oof.bind(globalThis)() // 输出red
如果把构造函数返回的函数改成箭头函数,this会绑定构造函数执行时的实例this,调用会输出green:
class foo { constructor(name){ this.name= name return () => { console.log(this.name); } } } let oof = new foo ('green'); oof() // 输出green
内容的提问来源于stack exchange,提问作者Aiden
相关产品推荐
相关产品推荐

