JS中如何模拟实现new操作符_javascript核心

风静小哥_4523

风静小哥_4523

2025-11-02

442人浏览

原创

new操作符创建对象时会连接原型、绑定this并返回实例;通过myNew函数可模拟该过程:创建空对象并继承构造函数原型,调用构造函数并将this指向新对象,若返回值为对象则返回该值,否则返回新对象。

js中如何模拟实现new操作符_javascript核心

在JavaScript中,new 操作符用于创建一个用户自定义对象类型的实例或具有构造函数的内置对象类型的实例。理解并模拟实现 new 操作符,有助于深入掌握 JavaScript 的面向对象机制和原型链原理。

new 操作符到底做了什么?

当我们使用 new Constructor() 时,JavaScript 引擎内部会执行以下步骤:

  • 创建一个全新的空对象;
  • 将这个新对象的隐式原型(__proto__)指向构造函数的 prototype 属性;
  • 将构造函数中的 this 绑定到这个新对象上,并执行构造函数体内的代码;
  • 如果构造函数返回了一个非原始类型(即对象或函数),则返回这个返回值;否则返回新创建的对象。

手动模拟实现 myNew 函数

基于上述行为,我们可以写一个函数 myNew 来模拟 new 的效果:

function myNew(Constructor, ...args) { // 1. 创建一个空对象,继承构造函数的 prototype const obj = Object.create(Constructor.prototype); // 2. 调用构造函数,this 指向新对象 const result = Constructor.apply(obj, args); // 3. 如果构造函数返回对象,则使用该返回值,否则返回新对象 return result instanceof Object ? result : obj; }

测试我们的模拟实现

来看一个实际例子:

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载
function Person(name, age) { this.name = name; this.age = age; } Person.prototype.sayHello = function() { console.log(`Hello, I'm ${this.name}`); }; // 使用原生 new const p1 = new Person("Alice", 25); p1.sayHello(); // 输出: Hello, I'm Alice // 使用我们实现的 myNew const p2 = myNew(Person, "Bob", 30); p2.sayHello(); // 输出: Hello, I'm Bob console.log(p1 instanceof Person); // true console.log(p2 instanceof Person); // true

可以看到,p2 和 p1 表现一致,说明我们的模拟基本成功。

处理构造函数返回对象的情况

有些构造函数可能会显式返回一个对象,这时候 new 应该忽略之前创建的实例。例如:

function Special() { this.value = 'ignored'; return { custom: 'object' }; } console.log(new Special()); // { custom: 'object' } console.log(myNew(Special)); // 同样输出 { custom: 'object' }

这验证了我们在 myNew 中对返回值的判断是必要的。

基本上就这些。不复杂但容易忽略细节。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

new操作符 javascript java js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.09.05

6995

14

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

2025.11.27

362

13

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

2026.04.09

364

30

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

2026.04.17

243

15

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2298

7

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

2023.06.20

4596

8

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.28

1395

5

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.03

1818

5

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

2023.08.17

10163

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
axios从入门到源码分析
axios从入门到源码分析

共21课时 | 2.8万人学习

WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.4万人学习