【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)
相关推荐
Web - Anonymous13 分钟前
使用Vue3 + Elementplus + Day.js 实现日期选择器(包括日、周、月、年、自定义) - 附完整示例
前端·javascript·vue.js
冴羽15 分钟前
2025 年 HTML 年度调查报告亮点速览!
前端·javascript·html
张元清16 分钟前
浏览器硬导航优化:提升用户体验的关键
前端·javascript·面试
xkxnq20 分钟前
第二阶段:Vue 组件化开发(第 23天)
前端·javascript·vue.js
客卿12320 分钟前
1/14-C语言重排数组
c语言·开发语言·算法
不穿格子的程序员20 分钟前
从零开始刷算法——二叉树篇:验证二叉搜索树 + 二叉树中第k小的元素
java·开发语言·算法
郝学胜-神的一滴25 分钟前
Python方法类型详解:类方法、静态方法与实例方法
开发语言·python·程序人生
廖若星辰LTY34 分钟前
网页端获取用户剪贴板内容
javascript
码农胖虎-java36 分钟前
【java并发编程】从源码角度彻底理解 ForkJoinPool.commonPool
java·开发语言·python
爱说实话41 分钟前
c# 20260113
开发语言·c#