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] 输出: […...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
