如何仿造一个new操作符?

92 阅读1分钟
// 实现一个new操作符
// new执行时做了什么
    /* 
      1.创建一个新对象
      2.将构造函数的this指向这个对象
      3.执行这个函数
      4.返回这个对象
    */
    function myNew(fn) {

            // 1.创建一个新的对象,并把这个对象的__proto__指向构造函数(fn)的原型
            let obj = {
              __proto__: fn.prototype
            }

            // 这里分为两步
            // 第一步是获取传进来的参数中除了第一个之外的
            // 2&3.第二步是用apply方法改变fn的this指向,并将剩余参数传入执行fn
            let res = fn.apply(obj, Array.prototype.slice.call(arguments, 1))

            // 进行判断,如果fn的返回值是一个对象则返回这个对象,否则返回新对象
            if ((typeof res == 'function' || typeof res == 'object') && typeof res !== null) return res

            // 4.返回obj
            return obj
      }

      // 进行验证是否成功

      function Person(name, age, on) {
            this.name = name
            this.age = age
            this.no = on
            // return {
            //   name: 'ls'
            // }
      }

      const p = myNew(Person, 'zs', 18, '被抓')
      
      console.log(p) // Person {name: "zs", age: 18, no: "被抓"}