JS--new的手写实现

一、new的底层实现 

1)创建一个空对象{}

2)将该空对象的原型指向构造函数的原型;

3)改变this指向,调用构造函数,为空对象添加属性和方法,获得构造函数的返回值;

4)判断返回值类型,如果为引用类型,则返回返回值;如果为简单数据类型,则返回该空对象。

二、代码实现

function myNew(Fn,...args) {
  // 1.创建一个空对象
  let obj = {}
  // 2.把新对象的__proto__指向其构造函数的prototype
  obj.__proto__ = Fn.prototype
  // 3.改变构造函数this指向空对象 并调用
  console.log(args)
  let res = Fn.apply(obj,args)
  //let res = Fn.call(obj,...args)
  // 4.判断函数执行结果类型,如果为引用类型,则返回函数执行结果,否则返回新对象
  if (res instanceof Object)
    return res
  else 
    return obj
}

三、代码测试:

function Son(name,age) {
  this.name = name
  this.age = age
 // return [1,2,3]
}

let f = new Son('zs',14)
console.log(f)

let mf = myNew(Son, 'ls',13)
console.log(mf)

测试结果:

 return 数组时:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值