new做了些什么?
function People(name, age){ this.name = name; this.age = age;};var xiaoming = new People();
要创建 People 的新实例,必须使用 new 操作符。以这种方式调用构造函数实际上会经历以下 4
个步骤:- 创建一个新对象;
- 将this 就指向了这个新对象;(同时还继承了该函数的原型) -- 将新对象 __ proto __ 指向 构造函数 prototype;
- 执行构造函数中的代码(为这个新对象添加属性);
- 返回新对象。
1. var obj = {};2. obj.__proto__ = People.prototype; People.call(obj); 3. People();4. teturn obj;
手写实现New
function myNew() { // 创建一个空的对象 let obj = new Object() // 获得构造函数(即arguments[0]) let Con = [].shift.call(arguments) //获取第一个参数,shift()直接修改原数组 // 链接到原型 obj.__proto__ = Con.prototype // 绑定 this,执行构造函数 let result = Con.apply(obj, arguments) // 确保 new 出来的是个对象 return typeof result === 'object' ? result : obj}