new 的实现原理

自己封装一个new

<script>
    // 创建一个构造函数
    function Father() {
      this.name = '小红';
      this.eat = function () {
        console.log('我叫'+this.name);
      }
    }
    /**
     * 1、在内存中创建一个新的对象;
     * 2、让this指向这个新的对象;
     * 3、执行构造函数里面的代码并给这个对象添加属性和方法;
     * 4、返回这个新对象;
     */
    // 使用new关键字来创建一个对象;
    var fa = new Father()
    console.log(fa);

    // ----------------------------------------

    /**
     * 实现new的过程
     */
    function _new() {
      // 1、创建一个空对象;
      var obj = {}

      // 利用 es6 数组的结构特点可以把函数的参数结构出来
      var [newfn, ...args] = [...arguments]

      // 2、将该对象 obj 的原型链 __proto__ 指向构造函数的原型 prototype,
      obj.__proto__ = newfn.prototype

      // 并且在原型链 __proto__ 上设置构造函数 constructor 为要实例化的 newfn
      obj.__proto__.constructor = newfn

      // 3、让构造函数 newfn 的this改变指向到 obj,并执行
      var result = newfn.call(obj, ...args)

      // 4、如果newfn执行后返回的是对象或函数类型,则返回该对象,否则返回 obj
      if (
        result &&
        (typeof result === 'object' || typeof result === 'function')
      ) {
        return result
      }
      return obj
    }

    // 构造函数;
    function f1(name, age) {
      this.name = name
      this.age = age
      this.eat = function() {
        return '我叫' + this.name + '今年' + this.age + '岁'
      }
    }

    // 创建一个对象;
    var obj2 = _new(f1, '小明', 18)
    console.log(obj2)
    console.log(obj2.name)  // 小明
    console.log(obj2.eat()) // 我叫小明今年18岁

  </script>
posted @ 2020-02-20 23:13  古怪精灵  阅读(264)  评论(0编辑  收藏  举报