手写new
new的过程
要了解new,肯定要知道原生new都在‘后台’执行了哪些操作。
- 在内存中创建一个新的空对象
- 将这个对象的
__proto__
指向构造函数的prototype
原型对象- 将构造函数的作用域赋给这个对象(就是改变构造函数的this指向这个新的对象)
- 执行构造函数内部的代码,并将其属性和方法添加给那个新的对象
- 返回这个新的对象
编写
new示范
要写一个new就要先看看new是怎么使用的
1 | function Person(name,age) { |
自制
按照原生new的流程一步一步的书写就可以实现
1 | function myNew(Con,...args) { |
注意
1 | let res = Con.apply(obj,args); |
这一部分是改变传入构造函数的this指向为创建的空对象。而第二个参数是要传递给那个构造函数的。apply方法是会执行一次Con的,所以你传入的args就传递给了那个构造函数,当然你的构造函数里面写的无非就是this.xxx = xxx
这种….
如果传入的构造函数有返回值,那么就要返回那个返回的值,前提是返回的是非空对象。都不满足则返回创建的新对象
使用
1 | function Person(name,age) { |