如何用 js 手写一个 new 方法

首先搞明白 new 方法做了一件什么事?

function People(firstName, lastName) {
  this.firstName = firstName
  this.lastName = lastName
}

People.prototype.fullName = function () {
  return `${this.firstName} ${this.lastName}`
}

const thinc = new People('first-name', 'last-name')

console.log(thinc);

在这里插入图片描述
简单来说就是隐式创建和返回了 this 对象

function People(firstName, lastName) {
  // 隐式创建
  // this = {}
  this.firstName = firstName
  this.lastName = lastName
  // 隐式返回
  // return this
}

具体点分为三步:

  1. 创建一个新对象
  2. 添加父类(People)的属性和方法到新对象中,继承父类原型上的属性和方法
  3. 如果执行结果有返回值,则返回执行结果;否则返回新创建的对象

代码

function _new(obj, ...rest){
  // 基于obj的原型创建一个新的对象
  // 在 prototype 上定义公共属性和方法
  const newObj = Object.create(obj.prototype);

  // 添加属性到新创建的 newObj 上, 并获取 obj 函数执行的结果.
  const result = obj.apply(newObj, rest);

  // 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象
  return result instanceof Object ? result : newObj;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值