【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)
相关推荐
Adellle3 分钟前
Java 异步回调
java·开发语言·多线程
海寻山4 分钟前
Java常用API详解(二):集合类API(ArrayList/HashMap/HashSet)实战,一篇吃透
开发语言·python
XMYX-04 分钟前
19 - Go 并发限制:限流与控制并发数
开发语言·golang
卵男(章鱼)11 分钟前
汽车网络通讯分析与仿真工具的系统工程:Vector CANoe与ZLG ZCANPRO深度剖析
开发语言·汽车·php
Dxy123931021615 分钟前
Python使用XPath定位元素:and和or组合条件
前端·javascript·python
摇滚侠15 分钟前
Java 零基础全套视频教程,面向对象(进阶),笔记 90-103
java·开发语言·笔记
say_fall15 分钟前
红黑树底层原理全解析:从 5 大性质到 STL 容器底层实现
开发语言·c++
青槿吖19 分钟前
Sentinel 进阶实战:Feign 整合 + 全局异常 + Nacos 持久化,生产环境直接用
java·开发语言·spring cloud·微服务·云原生·ribbon·sentinel
AI技术社区21 分钟前
Claude Code源码分析之提示词工程
java·开发语言·ai·ai编程
invicinble29 分钟前
前端技术栈--vuecli页面固定思路解密,与vue-router技术栈信息
前端·javascript·vue.js