【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)
相关推荐
学习3人组几秒前
Workerman实现 WSS 基于客户端 ID 的精准推送
android·java·开发语言
牛马11112 分钟前
Flutter CustomPaint
开发语言·前端·javascript
重庆兔巴哥21 分钟前
Java环境变量配置不成功,会有什么症状?
java·开发语言
大黄说说22 分钟前
不可变数据:函数式编程的基石与双刃剑
开发语言
不只会拍照的程序猿23 分钟前
《嵌入式AI筑基笔记02:Python数据类型02,从C的“硬核”到Python的“包容”》
开发语言·笔记·python
无限进步_24 分钟前
深入解析list:一个完整的C++双向链表实现
开发语言·c++·git·链表·github·list·visual studio
重庆兔巴哥37 分钟前
如何安装和配置Java开发环境(JDK)?
java·开发语言
biubiuibiu43 分钟前
JavaScript核心概念深度解析:位运算与短路逻辑
开发语言·javascript·ecmascript
2401_849644851 小时前
C++代码重构实战
开发语言·c++·算法
葡萄城技术团队1 小时前
Hurley:用 Rust 打造的高性能 HTTP 客户端 + 压测工具
开发语言·http·rust