new在原型链中扮演什么样的角色?
function sayHi(name){
this.name = name;
}
var Hi = new sayHi('zhangsan');
console.log('Hello,', Hi.name); // Hello, zhangsan
手写new的实现
- 创建一个空对象。
- 拿到构造函数。
- 让空对象的隐式原型指向构造函数的显示原型。
- 让构造函数的this指向我们创建的对象并执行。
- 如果执行的结果是引用类型则返回引用类型,否则返会创建的对象。
function myNew() {
// 1. 创建一个空对象
const obj = {};
// 2. 拿到构造函数,也就是第一个参数
const Constructor = Array.prototype.shift.call(arguments);
// 3. 让实例的隐式原型指向构造函数的显式原型
obj.__proto__ = Constructor.prototype;
// 4. 改变构造函数的this指向并执行
const res = Constructor.apply(obj, arguments);
// 5. 判断是否是引用类型,是则返回引用类型,不是则返回obj
return res instanceof Object ? res : obj;
}