new具体做了什么事情


通俗来说,我们都知道new一般做了下面四件事:

  1、创建一个空对象;

  2、将空对象的原型,指向于构造函数的原型;

  3、将空对象作为构造函数的上下文(改变this指向);

  4、对有返回值的构造函数做判断处理

 

我们详细来分析这四个点:

1、创建一个空对象

  这个其实就在内存中开辟一个新的空间,创建一个新的对象。若直接打印一个new对象的话可以看到返回的是一个空对象。

    

 

2、将空对象的原型,指向于构造函数的原型

  将空对象的__proto__指向Foo的原型Foo.prototype,这两个做 == 判断的话会返回true。

3、将空对象作为构造函数的上下文(改变this指向)

  若直接执行构造函数的话,此时内部的this指向的是window,因为是全局下。

      

 

 

 

 

 

    

 

 4、对有返回值的构造函数做判断处理

   如果构造函数有返回值,return的是一个基本类型,则对new,没有影响

   

  但是,如果返回的是一个引用类型(数组同理),则new就不起作用了

     

 手写new:

    //定义构造函数
    function Fun(age, name) {
      this.age = age
      this.name = name
      return 1
    }

    function myNew(fn, ...args) {
      //1、先创造空对象
      //其实等于var obj = Object.create({})  
      var obj = {}
      //2、obj的__proto__指向原型
      Object.setPrototypeOf(obj, fn.prototype)
      //3、改变this指向,执行构造函数内部函数
      var result = fn.apply(obj, args)
      //4、判断return
      return result instanceof Object ? result : obj
    }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM