【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)
相关推荐
MSTcheng.7 分钟前
【C++】C++11新特性(二)
java·开发语言·c++·c++11
晓13139 分钟前
第七章 【C语言篇:文件】 文件全面解析
linux·c语言·开发语言
愚者游世9 分钟前
Delegating Constructor(委托构造函数)各版本异同
开发语言·c++·程序人生·面试·改行学it
梵刹古音12 分钟前
【C语言】 指针基础与定义
c语言·开发语言·算法
Ekehlaft15 分钟前
这款国产 AI,让 Python 小白也能玩转编程
开发语言·人工智能·python·ai·aipy
rit843249917 分钟前
MATLAB中Teager能量算子提取与解调信号的实现
开发语言·matlab
开源技术20 分钟前
Python GeoPandas基础知识:地图、投影和空间连接
开发语言·ide·python
hedley(●'◡'●)23 分钟前
基于cesium和vue的大疆司空模仿程序
前端·javascript·vue.js·python·typescript·无人机
Cult Of24 分钟前
Alicea Wind的个人网站开发日志(2)
开发语言·python·vue
百思可瑞教育26 分钟前
构建自己的Vue UI组件库:从设计到发布
前端·javascript·vue.js·ui·百思可瑞教育·北京百思教育