手撕系列 — new关键字

119 阅读1分钟

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。—— MDN

在日常开发中,我们常常通过new去生成一个实例对象:

      function Demo(name, age) {
        this.name = name;
        this.model = age;
      }

      const test = new Demo("wang", 18);
      console.log(test);

new主要做了哪些工作呢?

new实现过程:

  1. 创建一个新的空对象
  2. 将空对象的__proto__指向构造函数的prototype
  3. 将这个空对象赋值给构造函数内部的this,并执行构造函数。
  4. 如果返回值是一个对象就返回该对象,否则返回构造函数的一个实例对象
      function myNew(Con, ...args) {
        // 1. 创建一个新的空对象
        const obj = {}
        // 2. 将空对象的 __proto__ 指向构造函数的原型
        obj.__proto__ = Con.prototype;
        // 3. 将this指向空对象
        let res = Con.apply(obj, args);
        // 4. 对构造函数返回值做判断,然后返回对应的值
        return res instanceof Object ? res : obj;
      }

      // 使用实例
      function Demo(name) {
        this.name = name;
      }
      let test = myNew(Demo, "useNew");
      console.log(test); // Demo {name: 'useNew'}
      console.log(test.__proto__ === Demo.prototype); // true