0
点赞
收藏
分享

微信扫一扫

你知道原型链?那你能实现一个new吗?

后来的六六 2022-04-15 阅读 27

new在原型链中扮演什么样的角色?

function sayHi(name){
  this.name = name;

}
var Hi = new sayHi('zhangsan');
console.log('Hello,', Hi.name);  // Hello, zhangsan

手写new的实现

  1. 创建一个空对象。
  2. 拿到构造函数。
  3. 让空对象的隐式原型指向构造函数的显示原型。
  4. 让构造函数的this指向我们创建的对象并执行。
  5. 如果执行的结果是引用类型则返回引用类型,否则返会创建的对象。
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;
}

总结

举报

相关推荐

0 条评论