JavaScript内功之new 过程

2022-08-21 手写系列

new 过程

作为 js 的基础,充分了解 new 的实现过程非常重要,今天的目的就是重写 new 的过程,带大家来了解下

/**
 * @description 实现类 new的过程 主要是模拟 new 过程
 * @return {*}
 */
function createNew() {
  // 1. 普通的函数传递过来的参数是arguments, 可以通过shift函数的特性来提取参数中的原函数
  const _fn = [].shift.call(arguments)
  // 2. 定义一个空对象 将来是要返回的对象
  const obj = {}

  // 3. 调用原函数,但是函数的this指向新对象
  const res = _fn.apply(obj, arguments)
  // 4. 将对象的__proto__ 指向函数的原型
  Object.setPrototypeOf(obj, _fn.prototype)
  // obj.__proto__ = Object.create(_fn.prototype)

  // 5. 如果原函数的返回值是对象 直接返回,如果是基本数据类型 返回自己定义的对象
  return res && typeof res === 'object' ? res : obj
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    1. 普通的函数传递过来的参数是 arguments, 可以通过 shift 函数的特性来提取参数中的原函数
    1. 定义一个空对象 将来是要返回的对象
    1. 调用原函数,但是函数的 this 指向新对象
    1. 将对象的proto 指向函数的原型
    1. 如果原函数的返回值是对象 直接返回,如果是基本数据类型 返回自己定义的对象
Last Updated: 8/29/2022, 7:47:57 AM
Powered By Valine
v1.5.1