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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:54:02