【JavaScript】new 的原理以及实现

网道 - new 命令的原理

使用new命令时,它后面的函数依次执行下面的步骤。

  1. 创建一个空对象,作为将要返回的对象实例。
  2. 将这个空对象的原型,指向构造函数的prototype属性。
  3. 将这个空对象赋值给函数内部的this关键字。
  4. 如果构造函数返回了一个对象,则返回该对象,否则返回新创建的对象。

模拟实现

[].slice.call() 将伪数组转为真数组,等同 Array.from()

js 复制代码
function _new(constructor, ...args) {
	// 1. 创建一个空对象,作为将要返回的对象实例。
    const obj = {}
    // 2. 将这个空对象的原型,指向构造函数的prototype属性。
    obj.__proto__ = constructor.prototype
    // 3. 将这个空对象赋值给函数内部的this关键字。(使用构造函数处理obj作为上下文this)
    const result = constructor.apply(obj, [].slice.call(args))
    // 4. 如果构造函数返回了一个对象,则返回该对象,否则返回新创建的对象。
    return (typeof result === 'object' && result != null) ? result : obj;
}

// 使用
function Person(name, age) {
    this.name = name
    this.age = age
}
Person.prototype.say = function() {
    return `我叫: ${this.name}, 今年: ${this.age} 岁!`
}
const person1 = _new(Person, '张三', 22)
const person2 = _new(Person, '李四', 18)
相关推荐
lizz311 小时前
C++模板编程:从入门到精通
java·开发语言·c++
shoubepatien2 小时前
JAVA -- 05
java·开发语言
寰天柚子2 小时前
Java并发编程中的线程安全问题与解决方案全解析
java·开发语言·python
沐知全栈开发2 小时前
Bootstrap 下拉菜单:设计与实现指南
开发语言
晚烛2 小时前
实战前瞻:构建高可靠、强协同的 Flutter + OpenHarmony 智慧教育平台
javascript·flutter·html
Evand J2 小时前
【MATLAB例程】多锚点RSSI定位和基站选择方法,基于GDOP、基站距离等因素。以Wi-Fi定位为例,附下载链接
开发语言·matlab·定位·gdop·rssi
superman超哥2 小时前
仓颉语言中锁的实现机制深度剖析与并发实践
c语言·开发语言·c++·python·仓颉
JAVA+C语言3 小时前
String Constant Pool
java·开发语言
保护我方头发丶3 小时前
ESP-wifi-蓝牙
前端·javascript·数据库
郝学胜-神的一滴3 小时前
OpenGL的glDrawElements函数详解
开发语言·c++·程序人生·游戏·图形渲染