【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)
相关推荐
a诠释淡然6 分钟前
C++模板元编程—现代C++的黑魔法
开发语言·c++
charlie11451419114 分钟前
现代C++工程:constexpr 基础:编译期求值的艺术
开发语言·c++
十九画生15 分钟前
从同步到异步:重新理解 JavaScript 的执行机制
javascript
半个落月18 分钟前
JavaScript 同步异步与 Promise 详解 —— 从 Event Loop 到手写 sleep
javascript
MemoriKu18 分钟前
Flutter 相册 APP 视频模态稳定化实战:从视频抽帧、Embedding 元数据到 Android 真机启动修复
android·开发语言·前端·flutter·架构·音视频·embedding
触底反弹22 分钟前
深入理解 JavaScript 同步与异步:从 Event Loop 到 async/await
javascript
SilentSamsara22 分钟前
特征工程系统方法论:编码、分箱、交互特征与特征选择
开发语言·人工智能·python·机器学习·青少年编程·信息可视化·pandas
morning_judger23 分钟前
Agent开发系列(十)-知识库建设(架构总览)
开发语言·人工智能
ch.ju27 分钟前
Java程序设计(第3版)第四章——继承的特点
java·开发语言
浮生望28 分钟前
JavaScript 异步编程核心:从同步阻塞到 Promise 事件循环
javascript·promise