new操作符到底做了什么
说起new第一反应就是创建对象实例化对象。然而实际上做了下面这些
- 创建一个空对象: 并且this变量引入该对象,同时还继承了函数的原型
var obj=new Object();
- 设置原型链 空对象指向构造函数的原型对象
obj.__proto__= Func.prototype;
- 执行函数体 修改构造函数this指针指向空对象,并执行函数体
var result =Func.call(obj);
- 判断返回值 返回对象就用该对象,没有的话就创建一个对象
if (typeof(result) == "object"){
func=result;
}
else{
func=obj;;
}
详细点说
-
获取实参中的第一个参数(构造函数),就是调用New函数传进来的第一个参数,暂时记为Constructor;
-
使用Constructor的原型链结合Object.create来创建一个对象,此时新对象的原型链为Constructor函数的原型对象;(结合我们上面讨论的,要访问原型链上面的属性和方法,要使用实例对象的__proto__属性)
-
改变Constructor函数的this指向,指向新创建的实例对象,然后call方法再调用Constructor函数,为新对象赋予属性和方法;(结合我们上面讨论的,要访问构造函数的属性和方法,要使用call或apply)
-
返回新创建的对象,为Constructor函数的一个实例对象
可以说new是用来做继承的,而创建对象的其实是Object.create(null)。 在new操作符的作用下,我们使用新创建的对象去继承了他的构造函数上的属性和方法、以及他的原型链上的属性和方法