关于javascript:前端面试之new操作符具体都干了什么

38次阅读

共计 1190 个字符,预计需要花费 3 分钟才能阅读完成。

new 操作符具体都干了什么?

  • (1) 首先创立了一个空对象。
  • (2) 设置原型,将对象的原型设置为函数的 prototype 对象。
  • (3) 让函数的 this 指向这个对象,执行构造函数中的代码
  • (4) 判断函数的返回值类型,如果是值类型,则返回创立的对象,如果是援用类型,则返回这个援用类型的对象。

    实现一下?

    function objectFactory(){
      let newObject = null,
      construct = Array.prototype.shift.call(anguments),
      result = null
    
      // 参数判断
      if(typeof construct !== 'function'){console.error('type error')
          return
      }
    
      // 新建一个空对象,对象的原型为构造函数的 prototype 对象
      newObject = Object.create(construct.prototype)
      // 将 this 指向这个新建对象,并执行
      result = construct.apply(newObject,arguments)
    
      // 判断返回对象
      if flag = result && (typeof result === 'object' || typeof result === 'boolean')
      return flag ? result : newObject
    }

    判断返回值类型?

     对于返回值来讲,当构造函数返回的是根本数据类型,那么此时返回的后果是咱们所创立的对象 newObject,当构造函数返回的是援用类型object || function 时,返回的是 result 值,此时通过 apply 函数又从新绑定了 this 指向,也就是说构造函数返回的是什么援用类型的值,以后返回值类型就是什么。
     具体代码可见:

    // 构造函数返回援用数据类型 Object
    let foo = objectFactory([function Foo(){this.name = 'name'; return new Object("name") },1])
    console.log(foo,"--------")  // [String: 'name'] --------
    // 当构造函数返回值为 Object("name"),所以返回值此时返回 result,程序又通过 apply 扭转了 this 的指向,指向了构造函数的返回值 Object('name'), 所以此时应用 new 操作符的返回值为援用数据类型[String: 'name']
    
    // 构造函数返回根本数据类型 String
    let foo = objectFactory([function Foo(){this.name = 'name'; return 'sss'},1])
    console.log(foo,"--------")  // Foo {name: 'name'} --------
    // 当构造函数返回值为字符串,所以此时返回 newObject,则此时的返回值为 Foo

正文完
 0