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)()无法得到预期结果的原因
拆解这个语句的执行步骤:
new outer(11):因为outer显式返回inner函数,这一步得到的是inner函数本身。- 紧接着调用
():此时inner作为普通函数调用,非严格模式下this默认指向全局对象,严格模式下this是undefined。this.abc = abc实际是给全局对象加属性(或严格模式下报错),而函数返回的是abc的值11,所以obj2是原始值11。 - 数字、字符串这类原始值无法拥有自定义属性,因此
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
相关产品推荐
相关产品推荐

