Skip to content

Latest commit

 

History

History
57 lines (39 loc) · 1.58 KB

7.md

File metadata and controls

57 lines (39 loc) · 1.58 KB

实现 new 关键字

new 的过程

  1. 创建一个空对象,这个对象将作为执行构造函数后返回的实例对象。
  2. 将新创建的对象的原型__proto__指向构造函数的prototype的对象。
  3. 将这个空对象赋值给构造函数的this,并执行构造函数。
  4. 根据构造函数执行逻辑,返回第一步创建的对象或构造函数的显示的返回值。

因为newjavascript的关键字, 不能进行覆盖,采用newFunc进行模拟实现。

function newFunc(...args) {
    // 取出args数组的第一个参数,即构造函数
    const constructor = args.shift()

    // 创建一个空对象,且这个空对象继承构造的 prototype 的属性
    const obj = Object.create(constructor.prototype)

    // 执行构造函数,得到构造函数的返回结果
    // 注意,这里使用 apply 使构造函数内部内部的 this 指向 obj
    const result = constructor.apply(obj, args)

    // 如果构造函数执行后,返回结果时对象类型,则直接将该结果返回,否则返回 obj 对象
    return (typeof result === 'object' && typeof result !== null) ? result : obj;
}

newFunc使用方式如下,

function Person(name) {
    this.name = name
}

const p = newFunc(Person, 'test')

console.log('p', p)

// { name: 'test' }

构造函数有显示返回值,且返回值为对象类型,那么构造函数返回结果就不再是实例目标了。

function Person(name) {
    this.name = name
    return { 1: 1 }
}

const p = newFunc(Person, 'test')

console.log('p', p)

// { 1: 1 }