模拟实现new关键字功能
2020年11月23日小于 1 分钟
模拟实现new关键字功能
在js中new关键字主要做了: 首先创建一个空对象,这个对象会作为执行new构造函数之后返回的对象实例, 将创建的空对象原型(__proto__
)指向构造函数的prototype属性,同时将这个空对象赋值给构造函数内部的this,并执行构造函数逻辑,根据构造函数的执行逻辑,返回初始创建的对象或构造函数的显式返回值。
/*
* File Created: Tuesday, 14th March 2023 5:02:13 pm
* Author: hotsuitor (hotsuitor@qq.com)
* -----
* Last Modified: Tuesday, 14th March 2023 5:08:14 pm
* Modified By: hotsuitor (hotsuitor@qq.com>)
*/
function newFn(...args) {
// 获取第一个参数,要new的函数
const constructor = args.shift()
// 创建一个空的对象,将实例化对象的原型指向构造函数的原型对象
const obj = Object.create(constructor.prototype)
// 修改this指向空对象,传入参数
const result = constructor.apply(obj, args)
// 判断返回值,如果函数返回值为基本数据类型时, 则new出的对象依然是创建出的对象
return result instanceof Object ? result : obj
}
function Person(name) {
this.name = name
}
let p1 = newFn(Person, 'Lisa')
let p2 = newFn(Person, 'Jery')
console.log(p1.name) // Lisa
console.log(p2.name) // Jery