嵌套函数返回内部函数用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
相关产品推荐
相关产品推荐

