实现new运算符
要实现new我们首先得知道在使用new关键词时它做了什么
![ec487452b92842cca0c02137241208cb.png](https://img-blog.csdnimg.cn/img_convert/ec487452b92842cca0c02137241208cb.png)
// 实例化对象Tom种类是猫
Tom = new Animal("Tom", "Cat");
console.log(Tom);
输出的结果为:
![1b7e654b8c892b64d18b81a616ef5756.png](https://img-blog.csdnimg.cn/img_convert/1b7e654b8c892b64d18b81a616ef5756.png)
这样看简单明了,new在实例化时做了这几件事情
1、创建一个空对象,且让该对象继承了Function.prototype;
2、执行我们的构造函数,改变this指向(指向刚刚创建的新对象);
3、抛出我们的新对象;
那么既然知道了new的内部运行原理后,我们就可以模拟出一个_new函数
![1605581dc6caaaa1883a80f29db86237.png](https://img-blog.csdnimg.cn/img_convert/1605581dc6caaaa1883a80f29db86237.png)
输出的结果为:
![2f5bc3fcf201825cd72098af2b08cbbd.png](https://img-blog.csdnimg.cn/img_convert/2f5bc3fcf201825cd72098af2b08cbbd.png)
大功告成,但是中间较为难理解的一般是[].shift.call(arguments)这也是面试时常问到的。
[].shift.call(arguments)
首先我们这么写是为了完成 arguments 类数组转为数组。shift 内部实现是使用的this代表调用对象。那么当[].shift.call() 传入 arguments对象的时候,通过 call函数改变原来 shift 方法的 this 指向, 使其指向了arguments,并对arguments进行复制操作。也就是说,[].shift.call( arguments ) 通过shift() 方法删除数组第一项也就是我们的Animal函数并拿到Animal函数返回给我们的Function。
![5274dafd2e191cd1050a8d112fcdf2ba.png](https://img-blog.csdnimg.cn/img_convert/5274dafd2e191cd1050a8d112fcdf2ba.png)
![54fcea81ee638fa10aa7ea3dc95a26f9.png](https://img-blog.csdnimg.cn/img_convert/54fcea81ee638fa10aa7ea3dc95a26f9.png)