【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)
相关推荐
yugi98783814 小时前
基于字典缩放的属性散射中心参数提取MATLAB仿真程序
开发语言·matlab
yanyu-yaya14 小时前
速学兼复习之vue3章节3
前端·javascript·vue.js·学习·前端框架
林恒smileZAZ14 小时前
前端拖拽,看似简单,其实处处是坑
前端·javascript·vue.js
小白学大数据14 小时前
绕过拼多多 App 反抓包机制的综合逆向解决方案
开发语言·爬虫·python·自动化
使者大牙14 小时前
【单点知识】 Python装饰器介绍
开发语言·数据库·python
带土114 小时前
2. C++ private、protected、public
开发语言·c++
我不是8神14 小时前
字节跳动 Eino 框架(Golang+AI)知识点全面总结
开发语言·人工智能·golang
古城小栈14 小时前
Rust复合类型 四大军阀:数、元、切、串
开发语言·后端·rust
跟着珅聪学java14 小时前
JavaScript中编写new Vue()实例的完整教程(Vue 2.x)
前端·javascript·vue.js
kong790692814 小时前
Python核心语法-Python自定义模块、Python包
开发语言·python·python核心语法