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

嵌套函数返回内部函数用new实例化报错:Cannot set property of undefined

问题分析与修复方案

你遇到的这个错误,核心原因大概率是调用返回的内部函数时没有正确使用new运算符,或者误用了new在外部函数上,导致内部函数里的this指向错误(严格模式下会变成undefined,自然没法设置obj属性)。

先看你的代码本身:

function fun1() {
  function fun2(obj) {
    this.obj = obj;
  }
  return fun2;
}

这段代码的逻辑是没问题的——外部函数fun1返回内部构造函数fun2,只要正确用new实例化fun2,就能正常创建实例。

正确的使用方式

你需要先获取fun1返回的内部函数,再用new去实例化它:

// 第一步:拿到内部构造函数
const MyConstructor = fun1();
// 第二步:用new实例化
const myInstance = new MyConstructor({ key: "value" });
// 验证结果
console.log(myInstance.obj); // 输出 { key: "value" }

为什么会报错?

如果出现Cannot set property 'obj' of undefined,通常是这两种错误调用导致的:

  • 直接调用返回的函数,没有加new:
    const MyConstructor = fun1();
    MyConstructor({ key: "value" }); // 这里是普通函数调用,严格模式下this为undefined
    
  • 错误地给外部函数fun1加new,然后调用返回的函数:
    const wrongInstance = new fun1(); // wrongInstance其实是fun2函数,因为fun1返回了它
    wrongInstance({ key: "value" }); // 同样是普通调用,this指向错误
    

增强型修复:避免错误调用

如果你想让内部函数不管有没有new都能正常工作,可以在fun2里加一个校验,确保this指向实例:

function fun1() {
  function fun2(obj) {
    // 检查是否通过new调用,如果不是,就自动返回new实例
    if (!(this instanceof fun2)) {
      return new fun2(obj);
    }
    this.obj = obj;
  }
  return fun2;
}

这样不管用户怎么调用,都能得到正确的实例:

const MyConstructor = fun1();
const inst1 = new MyConstructor({ a: 1 });
const inst2 = MyConstructor({ b: 2 });
console.log(inst1.obj, inst2.obj); // { a: 1 }, { b: 2 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:29:25