JS 面试问题: 手写 new

JS 面试问题: 手写 new 🆕

首先, new 操作符可以创建一个用户自定义的对象类型或者创建一个带有构造函数的内置对象类型.

当一个函数通过 new 方式调用时, 这个函数被当作一个构造函数. new 将做下面的事情

  1. 创建一个空的纯 JS 对象. 我们称之为 newInstance.
  2. newInstance[[Prototype]] 指向构造函数的 prototype 属性如果 prototype 是一个对象. 否则指向 Object.prototype.
    • 📖原型链, 从构造函数创建的所有实例都可以访问添加到构造函数的 prototype 上的属性或对象
  3. 用给定的参数执行构造函数, 将 newInstance 绑定为 this 上下文. 即在构造函数中所有对 this 的引用都将指向 newInstance
  4. 如果构造函数返回 non-primitive, 其将作为 new 操作符的返回值返回. 否则, 如果构造函数不返回任何值或者返回了 primitive, new 操作符返回 newInstance.
    • 📖primitive: 指 null/undefined/string/number/boolean/bigint/symbol
    • 通常构造函数不返回值, 但是可以通过返回值来覆盖正常对象的返回过程.

有了上面的介绍, 就可以开始写代码了

function myNew(constructor, ...args) {
  // 第一步
  let newInstance = {}

  // 第二步
  if (constructor.prototype !== null) {
    Object.setPrototypeOf(newInstance, constructor.prototype)
  } else {
    Object.setPrototypeOf(newInstance, Object.prototype)
  }

  let result = constructor.apply(newInstance, args)

  if (typeof result === 'object' && result !== null) {
    return result
  } else {
    return newInstance
  }
}

测试

function Person(name) {
  return {
    name,
    sayName() {
      console.log('this.name',this.name)
    }
  }
}

let p = myNew(Person, 'levi')
p.sayName()
console.log('p',p)
let p1 = new Person('levi')
p1.sayName()
console.log('p1',p1)

console.log('================================')

function Mistake() { return 1 }
let m = myNew(Mistake)
console.log('m',m)
let m1 = new Mistake()
console.log('m1',m1)

在这里插入图片描述

谢谢你看到这里😊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值