在js中,咱们常常会用到 new 操做符,当咱们对构造函数使用new操做符时,具体作了哪些事情呢?函数
它会完成如下四个步骤:this
1.建立一个空的对象spa
2.设置原型链:将新对象的constructor属性设置为构造函数信息,设置新对象的__proto__属性指向构造函数的prototype对象prototype
3.让构造函数中的this指向新对象,并执行构造函数的函数体对象
4.判断构造函数的返回值类型,将初始化完成的对象地址,保存到等号左边的变量中blog
结合代码分析:原型链
var Func = function() {作用域
...原型
}string
var func = new Func()
咱们来具体分析:
new一共经历了4个阶段:
1.建立一个空对象
var obj = {}
2.设置原型链
obj.__proto__ = Func.prototype
3.让Func中的 this 指向 obj,并执行Func的函数体。(由于建立新的对象后,构造函数的做用域赋给了新对象,因此 this 指向了新对象)
var res = Func.call(obj)
4.判断Func的返回值类型
若是是基本数据类型,则返回obj,若是是引用数据类型,则返回引用类型的对象
if (typeof(res)=== "object"){
func = res
}else {
func = obj
}
注意:在构造函数没有返回值的状况下,返回新建立的对象;
若是构造函数有返回值res,那么就要判断值的类型:
返回值res为基本数据类型(string、number、null、undefined、boolean、symbol),那么返回新建立的对象。
返回值res为引用数据类型时,函数的返回值res才为指定对象,此时返回res。
构造函数没有返回值的状况:
构造函数返回值为基本数据类型的状况:
构造函数返回值为引用数据类型的状况:
由Person {name : "Sunwukong"} 和 {name : "Zhubajie"}
能够看出,当返回值是引用类型时,则使用 return 的对象,此时 new 操做也失效了。