new操作符的作用?

118 阅读2分钟

new操作符的作用?

了解new的作用?

    function Fn1(name) {
      this.name = name
    }

    Fn1.prototype.Fn2 = function () {
      console.log(this.name);
    }


    let test = new Fn1('zhan')

    console.log(test);        //打印结果  Fn1 {name: 'zhan'}
    console.log(test.name);   //打印结果   zhan
    test.Fn2()                //打印结果   zhan

通过上述代码可以得出: new 通过构造函数 fn1 创建出来的实例可以访问到构造函数中的属性
new 通过构造函数 fn1 创建出来的实例可以访问到构造函数原型链中的属性(即 fn2)
构造函数 fn1 的 this 指向是 new 通过构造函数 fn1 创建出来的实例

new操作符的实现步骤?

  1. 创建一个空的简单 JavaScript 对象(即  {} );
  2. 为创建的空对象添加属性  __proto__ ,将该属性链接至构造函数的原型对象;
  3. 将构造函数中的this绑定到新建对象
  4. 返回该对象,如果该函数没有返回对象,则返回 this

自己实现一个new操作符

Object.setPrototypeOf() 方法设置一个指定的对象的原型(即,内部 [[Prototype]] 属性)到另一个对象或 null。
apply() 方法调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数。

   // 封装一个函数
    function newCreate(functionName, ...rest) {
    
      let obj = {}      //声明一个空得对象

// obj 对象需要访问到构造函数原型链上的属性,所以我们通过 setPrototypeOf 将两者联系起来。这段代码等同于 obj.__proto__ = functionName.prototype

      Object.setPrototypeOf(obj, functionName.prototype)

      let returnValue = functionName.apply(obj, rest)

      // return 出去的时候判断
      return returnValue instanceof Object ? returnValue : obj
    }

总结:

记住重要得步骤就行!!

  1. 创建一个空的简单 JavaScript 对象(即  {} );
  2. 为创建的空对象添加属性  __proto__ ,将该属性链接至构造函数的原型对象;
  3. 将构造函数中的this绑定到新建对象
  4. 返回该对象如果该函数没有返回对象,则返回 this

注意:如果你没有使用new运算符,构造函数会像其他的常规函数一样被调用,并不会创建一个对象。这种情况下this的指向也不一样。