js构造函数创建对象是否加new问题
今天看到这样一道题:
填写"TODO"处的内容让下面代码支持a.name="name1";b.name="name2";
functionObj(name){
//TODO
}
obj./*TODO*/="name2";
vara=Obj("name1");
varb=newObj;
问题1:new操作符做了些什么呢?
创建一个新对象;
将构造函数的作用域赋给新对象(因此this就指向了这个新对象);
执行构造函数中的代码(为这个新对象添加属性);
返回新对象。
问题2:不加new操作符直接执行构造函数会发生什呢?
functionObj(name){
this.name=name;
console.log(this);//严格模式下是undefined非严格模式下是window对象
}
vara=Obj("name1");
console.log(a);//结果=>undefined
哦,原来只是当作正常的函数调用来执行,Obj没有返回值,故a是undefined。
两者区别总结
使用new操作符创建对象,并且构造函数没有返回值或者返回为基本数据类型,那么返回该对象,如下例:
functionObj(name){
this.name=name;
}
varb=newObj;
console.log(b);//Obj{name:undefined}
functionObj(name){
this.name=name;
return'chic';
}
varb=newObj;
console.log(b);//同上
如果构造函数返回一个引用类型:
functionObj(name){
this.name=name;
return{};
}
varb=newObj;
console.log(b);//{}
总结
对于不加new来执行构造函数来说,返回值就是构造函数的执行结果;对于加new关键字来执行构造函数而言,如果return的是基本数据类型,那么忽视掉该return值,如果返回的是一个引用类型,那么返回该引用类型。
那么问题答案你有了吗?
参考答案:
functionObj(name){
this.name=name;
returnthis;
}
Obj.prototype.name="name2";
vara=Obj("name1");
varb=newObj;
以上就是我们给大家整理的js构造函数创建对象是否加new问题的全部内容,大家阅读后还有疑问可以在下方留言区讨论,感谢你对毛票票的支持。