javascript中new操作符的工作原理
在 JavaScript 中,new 操作符用于创建对象的实例。它可以让我们通过构造函数创建一个新的对象,并初始化该对象的属性和方法。尽管 new 操作符的使用很常见,但它在背后实际进行了几个步骤。下面详细解释 new 操作符具体做了哪些事情。
new 操作符的执行过程
当我们使用 new 来调用一个构造函数时,JavaScript 会自动执行以下步骤:
-
创建一个新的空对象:
- 创建一个新的对象(我们可以称它为
newObj),这个对象继承了构造函数的prototype属性。 newObj.__proto__ = Constructor.prototype。
- 创建一个新的对象(我们可以称它为
-
将
this绑定到新创建的对象上:- 构造函数中的
this会被绑定到新创建的对象(即newObj)上。 - 这样,在构造函数中定义的属性和方法就会被添加到新对象上。
- 构造函数中的
-
执行构造函数的代码:
- 构造函数会被执行,并且
this现在指向newObj。构造函数内部可以为新对象添加属性或方法。
- 构造函数会被执行,并且
-
返回新对象:
- 如果构造函数显式返回一个对象,那么返回这个对象。
- 如果构造函数没有显式返回对象,则默认返回创建的
newObj。
示例
通过一个简单的例子来说明 new 的工作原理:
function Person(name, age) {this.name = name;this.age = age;this.sayHello = function() {console.log('Hello, my name is ' + this.name);};
}const person1 = new Person('Alice', 25);
console.log(person1.name); // 输出: Alice
console.log(person1.age); // 输出: 25
person1.sayHello(); // 输出: Hello, my name is Alice
在这个例子中,我们使用 new 来创建 Person 对象的实例 person1,这个对象拥有 name 和 age 属性,并且可以调用 sayHello 方法。
new 操作符的执行细节
让我们逐步看一下当执行 new Person('Alice', 25) 时,发生了什么:
-
创建一个新的空对象:
- 一个空对象
newObj被创建,它的__proto__指向Person.prototype。
newObj = Object.create(Person.prototype); - 一个空对象
-
将
this绑定到新对象上:- 调用构造函数
Person时,this被绑定为newObj,并且构造函数内部的this.name和this.age被赋值。
Person.call(newObj, 'Alice', 25); - 调用构造函数
-
执行构造函数的代码:
- 构造函数内部的代码运行,为
newObj添加了name、age属性以及sayHello方法。
- 构造函数内部的代码运行,为
-
返回新对象:
- 因为构造函数没有显式返回对象,所以默认返回
newObj。
- 因为构造函数没有显式返回对象,所以默认返回
最终结果是,一个拥有 name 和 age 属性的对象 person1 被创建,并且继承了 Person.prototype 的所有属性和方法。
new 操作符的步骤模拟
我们可以通过手动模拟 new 操作符来理解它的内部工作原理。下面是一个简化的 new 的实现:
function myNew(constructor, ...args) {// 1. 创建一个新的空对象const obj = Object.create(constructor.prototype);// 2. 将 this 绑定到新的对象并执行构造函数const result = constructor.apply(obj, args);// 3. 如果构造函数返回的是一个对象,则返回该对象,否则返回新创建的对象return result instanceof Object ? result : obj;
}function Person(name, age) {this.name = name;this.age = age;
}const person1 = myNew(Person, 'Alice', 25);
console.log(person1.name); // 输出: Alice
console.log(person1.age); // 输出: 25
在上面的代码中,myNew 函数模拟了 new 的基本行为,包括创建对象、绑定 this、执行构造函数和返回新对象。
new 操作符中的返回值
- 如果构造函数显式返回一个对象,则
new操作符返回该对象。 - 如果构造函数没有返回对象,
new操作符将返回创建的对象。
例如:
function Person(name) {this.name = name;return { customObject: true };
}const person1 = new Person('Alice');
console.log(person1); // 输出: { customObject: true }function Animal(name) {this.name = name;// 没有显式返回值
}const animal1 = new Animal('Tiger');
console.log(animal1); // 输出: Animal { name: 'Tiger' }
在 Person 的例子中,构造函数返回了一个对象 { customObject: true },因此 new 操作符返回了这个对象,而不是默认的新对象。
在 Animal 的例子中,构造函数没有显式返回对象,new 操作符会返回 new Animal() 创建的实例对象。
new 的使用场景
new 操作符最常用于构造函数模式或类来创建对象的实例。常见场景包括:
-
创建类的实例:
- JavaScript 中的类定义使用
class语法可以通过new来创建实例。
class Person {constructor(name) {this.name = name;} }const person1 = new Person('Alice'); console.log(person1.name); // 输出: Alice - JavaScript 中的类定义使用
-
使用构造函数创建对象:
- 除了
class语法,传统的构造函数模式也是通过new来创建实例。
function Car(model) {this.model = model; }const car1 = new Car('Toyota'); console.log(car1.model); // 输出: Toyota - 除了
-
内置对象的实例化:
- JavaScript 的一些内置对象也需要通过
new来创建实例,如Date、RegExp、Array等。
const today = new Date(); console.log(today); // 输出当前日期和时间 - JavaScript 的一些内置对象也需要通过
总结
new 操作符在 JavaScript 中用于创建对象的实例,它在背后执行了以下几步:
- 创建一个新的空对象并将其原型指向构造函数的
prototype。 - 将构造函数的
this绑定到新对象上。 - 执行构造函数的代码,初始化新对象的属性。
- 返回这个新对象(如果构造函数返回对象,则返回该对象)。
通过 new 操作符,我们可以轻松创建复杂对象,并且通过原型链继承共享方法和属性。
相关文章:
javascript中new操作符的工作原理
在 JavaScript 中,new 操作符用于创建对象的实例。它可以让我们通过构造函数创建一个新的对象,并初始化该对象的属性和方法。尽管 new 操作符的使用很常见,但它在背后实际进行了几个步骤。下面详细解释 new 操作符具体做了哪些事情。 new 操…...
基于springboot+vue 旅游网站的设计与实现
基于springbootvue 旅游网站的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,…...
Ansible集群服务部署案例
案例描述 本案例共讲述了多个节点部署Elk集群日志分析系统,分别在三个节点使用ansible部署Kibana、Logstash以及Elasticsearch服务。 案例准备 1. 规划节点 IP 主机名 节点 192.168.100.25 ansible Ansible节点 192.168.100.35 node1 Elasticsearch/Kiba…...
探索AI编程新境界:aider库揭秘
文章目录 **探索AI编程新境界:aider库揭秘**背景:为何选择aider?简介:aider是什么?安装指南:如何安装aider?功能演示:aider的简单用法实战应用:aider在不同场景下的使用常…...
SQL Server 2012 ldf日志文接太大的截断和收缩日志处理
SQL Server 2012 ldf日志文接太大的截断和收缩日志处理操作 --- SQL Server 2012 ldf日志文接太大的截断和收缩日志处理 ----- 查看所有 database 列表及详情 select * from sys.databases;-- 切换到指定的操作数据库 use testdb;-- 查询当前数据库的日志文件ID和逻辑文件名 S…...
java日志门面之JCL和SLF4J
文章目录 前言一、JCL1、JCL简介2、快速入门3、 JCL原理 二、SLF4J1、SLF4J简介2、快速入门2.1、输出动态信息2.2、异常信息的处理 3、绑定日志的实现3.1、slf4j实现slf4j-simple和logback3.2、slf4j绑定适配器实现log4j 4、桥接旧的日志框架4.1、log4j日志重构为slf4jlogback的…...
Oracle DB运维常用的视图及数据字典
List item 本文介绍一些Oracle DB日常运维最常用到(使用频率很高)的视图及数据字典 用户有关的常用视图: 1、 查看当前用户的缺省表空间* SQL>select username,default_tablespace from user_users; 2、 查看当前用户的角色 SQL>sele…...
vue.config.js devServer中changeOrigin的作用
问题 vue开发时,为了解决前端跨域问题,通常在vue.config.js配置 devServer proxy devServer: {proxy:{/api: {target: http://b.com,changeOrigin: false},}, }官方文档http-proxy options对changeOrigin的解释 option.changeOrigin: true/false, Defa…...
基于Ubuntu 20.04 LTS上部署MicroK8s(最小生产的 Kubernetes)
目录 文章目录 目录简介Kubernetes简介MicroK8s简介Ubuntu系统MicroK8s的优势安装环境基本要求执行安装命令加入群组(使用非 root 用户访问)开启 dashboard 仪表盘查看服务名称查看仪表盘开放的端口打开浏览器检查状态打开你想要的服务(使用附加组件)开始使用 microk8s访问 Kub…...
Spring:项目中的统一异常处理和自定义异常
介绍异常的处理方式。在项目中,都会进行自定义异常,并且都是需要配合统一结果返回进行使用。 1.背景引入 (1)背景介绍 为什么要处理异常?如果不处理项目中的异常信息,前端访问我们后端就是显示访问失败的…...
有点快要跟不上时代的感觉
团队的群里面有一个同事突然问了下,下面的这个 JavaScript 如何进行优化 var startIndex (start undefined || start null) ? null : start[0].Value;看上面的代码就是典型的判断和返回的问题。 如果是要调试的话也不是做不出来,但可能要花点时间&a…...
【pytorch】pytorch入门4:神经网络的卷积层
文章目录 前言一、定义概念 缩写二、性质三、代码总结参考文献 前言 使用 B站小土堆课程的笔记 一、定义概念 缩写 卷积层是神经网络中用于突出特征来进行分类任务的层。 二、性质 卷积核例子:vgg16 model 三、代码 添加库 python代码块import os import …...
【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力
目录 🍔 LSTM介绍 🍔 LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 🍔 小结 学习目标 🍀 了解LSTM内部结构及计算公式. 🍀 掌握Pytorch中LSTM工具的使用. &…...
QT学习笔记之文件操作
你千万不要跟任何人谈起任何事。你只要一谈起,就会想念起每一个人来。 在ui界面添加一个LineEdit(lEt)、QPushButton(btn)、QWidget widget.cpp #include "widget.h" #include "ui_widget.h" #include <QFile> #include <QFileDialo…...
Mybatis XML配置文件操作数据库
Mybaits在操作数据库时,可以有两种方式;第一种是使用注解的方式操作,另一种是使用XML配置文件的方式:一般而言,若没有特别的要求,则编写一些简单的SQL语句,可以直接使用注解的方式;编…...
Ansible-template模块动态生成特定文件
文章目录 一、Jinja2介绍什么是主要特性安装基本用法进阶特性总结 Jinja2与Ansible关系1. 模板引擎2. Ansible 的依赖3. 变量和模板4. 动态生成配置5. 社区和生态系统总结 二、Ansible如何使用Jinja2使用template模块Jinja2文件中使用判断和循环Jinja2文件中使用判断语法 Jinja…...
【Hadoop】【vim编辑器】【~/.bashrc 文件】如何编辑
1. 进入 vim 编辑器 在终端中输入以下命令: vim ~/.bashrc 2. 进入插入模式 打开文件后,你将处于普通模式。在普通模式下,你不能直接编辑文本。 要进入插入模式,请按下 i 键。这时,你应该会看到屏幕底部出现 -- 插…...
vs code自动报错
让vs code自动报错, 点击插件 → 搜索error lens → 点击install, 下载完后,编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置(settings) → 点击常用设置 → 修改字符缩进。...
详细分析Nginx中的proxy_pass 末尾斜杠
目录 前言1. 基本知识2. Demo 前言 对于Nginx的讲解,更多推荐阅读: Nginx配置静态网页访问(图文界面)Nginx将https重定向为http进行访问的配置(附Demo)Nginx从入门到精通(全)详细分…...
数据结构:双指针—移动0(OJ283)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
