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

JavaScript中使用new关键字调用函数的两类实例化问题咨询

JavaScript构造函数返回值与实例化的问题解析

问题1:obj.abc返回undefined的原因

当用new调用构造函数时,默认会创建一个新对象绑定到构造函数的this,最后返回这个新实例。但如果构造函数显式返回了引用类型(比如函数、对象),new操作符会直接返回这个引用类型,而非原本创建的this实例。

看这段代码:

function outer(abc) {
  this.abc = abc;
   return function inner() {
    this.abc = abc;
    return this.abc;
  }
}
var obj = new outer(123);

这里outer显式返回了inner函数,所以obj实际上是inner函数本身,而非outer构造的实例对象。inner函数自身没有abc属性,因此obj.abc返回undefined。

问题2:移除return后正常输出的原因

移除return关键字后,outer函数没有显式返回值,new操作符会执行默认逻辑:返回绑定了this的新实例。这个实例已经通过this.abc = abc赋值了属性,所以obj.abc能正常输出传入的123。

问题3:var obj2= new outer(11)()无法得到预期结果的原因

拆解这个语句的执行步骤:

  1. new outer(11):因为outer显式返回inner函数,这一步得到的是inner函数本身。
  2. 紧接着调用():此时inner作为普通函数调用,非严格模式下this默认指向全局对象,严格模式下this是undefined。this.abc = abc实际是给全局对象加属性(或严格模式下报错),而函数返回的是abc的值11,所以obj2是原始值11。
  3. 数字、字符串这类原始值无法拥有自定义属性,因此obj2.abc返回undefined。

如果想让inner调用生成带abc属性的实例,需要用new调用inner:

var obj2 = new (new outer(11))();
console.log(obj2.abc); // 输出11

此时inner作为构造函数被调用,里面的this指向新创建的inner实例,this.abc = abc会给这个实例绑定属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:57:18