new具体做了什么事情
通俗来说,我们都知道new一般做了下面四件事:
1、创建一个空对象;
2、将空对象的原型,指向于构造函数的原型;
3、将空对象作为构造函数的上下文(改变this指向);
4、对有返回值的构造函数做判断处理
我们详细来分析这四个点:
1、创建一个空对象
这个其实就在内存中开辟一个新的空间,创建一个新的对象。若直接打印一个new对象的话可以看到返回的是一个空对象。
2、将空对象的原型,指向于构造函数的原型
将空对象的__proto__指向Foo的原型Foo.prototype,这两个做 == 判断的话会返回true。
3、将空对象作为构造函数的上下文(改变this指向)
若直接执行构造函数的话,此时内部的this指向的是window,因为是全局下。
4、对有返回值的构造函数做判断处理
如果构造函数有返回值,return的是一个基本类型,则对new,没有影响
但是,如果返回的是一个引用类型(数组同理),则new就不起作用了
手写new:
//定义构造函数 function Fun(age, name) { this.age = age this.name = name return 1 } function myNew(fn, ...args) { //1、先创造空对象 //其实等于var obj = Object.create({}) var obj = {} //2、obj的__proto__指向原型 Object.setPrototypeOf(obj, fn.prototype) //3、改变this指向,执行构造函数内部函数 var result = fn.apply(obj, args) //4、判断return return result instanceof Object ? result : obj }