前端面试之new操作符具体都干了什么?

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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值