深入解析JavaScript中构造函数和new操作符

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》

​ 

目录

✨ 前言

✨ 正文

第一节:构造函数

第二节:new操作符

第三节:实例与原型

✨ 结语


 

✨ 前言

        JavaScript中的构造函数是一种特殊的函数,用于生成对象。它们通常以大写字母开头,可以通过new操作符来调用。

        new操作符在调用构造函数时会进行以下操作:

  1. 创建一个空的JavaScript对象
  2. 将这个空对象的__proto__属性链接到构造函数的prototype属性,从而使这个空对象继承构造函数的prototype属性中的方法和属性
  3. 将构造函数内部的this绑定到这个空对象
  4. 如果构造函数没有返回对象,则将这个空对象作为new表达式的结果返回

举个例子:

function Person(name) {
  this.name = name;
}

Person.prototype.sayName = function() {
  console.log(this.name);
};

const person = new Person("John");

person.sayName(); // 输出 "John"

        这里调用new Person("John")时:

  1. 创建了一个空对象person
  2. person.proto 链接到了 Person.prototype
  3. this在Person函数内部指向了person
  4. 最后返回了person对象

        所以person对象就可以调用继承的sayName方法。

        需要注意的是,如果构造函数返回了一个对象,那么new表达式会直接返回这个对象,而不是创建的空对象:

function Person(name) {
  this.name = name;
  
  return { 
    name: name
  };
}

const person = new Person("John");

console.log(person.name); // 输出 "John"

 这里构造函数返回了一个对象,new表达式直接将这个对象返回了,而不是内部创建的空对象。

✨ 正文

第一节:构造函数

  1. 构造函数是一种特殊的函数,主要用途是初始化新创建的对象。
  2. 构造函数名的第一个字母要大写,以区别于普通函数。
  3. 构造函数可以接受参数,用于向新对象传递初始化值。
  4. 构造函数内部使用this关键字来引用新创建的对象。
  5. 构造函数不需要return来返回值,通常会省略return语句。
  6. 如果return一个对象,则该对象会覆盖内部创建的新对象,作为构造函数的返回值。
  7. 构造函数可以在原型对象上定义方法,由所有实例共享使用。
// 构造函数定义
function Person(name, age) {
  this.name = name; 
  this.age = age;
}

// 调用构造函数
const person = new Person('Jack', 18);

第二节:new操作符

  • new是一个操作符,用来在调用函数时生成一个新对象。
  • 调用new时会进行以下操作:
  1. 创建一个空对象,对象原型链接到构造函数的原型
  2. 绑定this到新对象,执行构造函数代码
  3. 如果构造函数没有返回对象,则返回新对象
  • new调用的主要作用:
  1. 创建新对象
  2. 链接原型,属性继承
  3. this绑定
  4. 返回新对象
  • 如果构造函数返回了一个对象,new会直接返回该对象而不是内部创建的对象。
function Person(name) {
  this.name = name;
  
  return {
    name: name
  }; 
}

const person = new Person('Jack');
console.log(person.name); // Jack

        这么一比对,可以看出当构造函数返回对象时,new会将那个对象返回,而不是新建的this对象。

第三节:实例与原型

  1. 每个实例都会从构造函数的原型上继承属性和方法。
  2. 原型对象可以通过Object.getPrototypeOf(obj)查看。
  3. instanceof运算符可以检查实例与构造函数的关系。
  4. 构造函数的原型prototype属性指向原型对象。
  5. 实例的__proto__属性指向构造函数的prototype。
  6. 原型链会通过__proto__逐级查找属性和方法。
function Person() {}

var person = new Person();

person.[[Prototype]] -> Person.prototype -> Object.prototype -> null

        这样可以更直观地呈现原型链的层级关系。

        另外,在讲解构造函数和原型关系时,可以添加更明确的说明:

        构造函数的prototype属性指向原型对象,原型对象包含实例共享的属性和方法。实例通过__proto__隐式原型属性关联到原型对象,从而可以通过原型链查找属性和方法。

✨ 结语

        通过这三个部分的讲解,我们全面详细地剖析了JavaScript中构造函数和new的工作原理、特性以及如何共同应用它们实现面向对象编程。这篇博客内容偏理论和概念性,如果需要的话可以补充更多具体代码案例进行辅助说明。请检查是否需要修改或补充解释某些部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319647.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ssm基于java的自助医疗服务系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本自助医疗服务系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

C#MQTT编程04--订阅报文

1、报文回顾 在MQTT中,消息传递模式是采用发布订阅模式(Publish-Subscribe Pattern),它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦,使得两者不需要建立…

【python】07.字符串和常用数据结构

字符串和常用数据结构 使用字符串 第二次世界大战促使了现代电子计算机的诞生,最初计算机被应用于导弹弹道的计算,而在计算机诞生后的很多年时间里,计算机处理的信息基本上都是数值型的信息。世界上的第一台电子计算机叫ENIAC(电…

冠军获奖经历:这一路我们不孤单!

Datawhale干货 获奖:元贞、小罗,Datawhale优秀学习者 前 言 大家好,我是 2023 寻找游戏大模王 AI 原生应用大赛的 Top1 荆轲刺秦王团队的小罗,很高兴能在这里与大家分享我们这次比赛的经验,同时也希望以后有机会可以和…

华为常用的命令——display,记得点赞收藏!

华为设备提供了多条display命令用于查看硬件部件、接口及软件的状态信息。通常这些状态信息可以为用户故障处理提供定位思路。 常用的故障信息搜集的命令如下: 路由器常用维护命令表 交换机常用的故障信息搜集 关注 工 仲 好:IT运维大本营,获…

函数栈桢的创建和销毁

函数栈桢的创建和销毁 一、解决的问题二、认识常用的寄存器及其指令操作三、函数栈桢解析三、回答问题 一、解决的问题 1.局部变量是怎么创建的?  2.为什么局部变量的值是随机值?  3.函数是怎么传参的?传参的顺序是怎样的?  4.…

全新小白菜QQ云端机器人登录系统源码 /去除解密授权学习版源码

源码介绍: 全新小白菜QQ云端机器人登录系统源码,是一款经过全面解密的授权学习版源码。 这款源码已解除了授权版的限制,然而许多人可能对其用途并不了解。实际上,该源码主要面向群机器人爱好者设计。它是一个基于挂机宝机器人框…

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

css3背景与渐变

css3背景与渐变 前言背景颜色background-color基础知识背景图片background-image基础知识背景图片的重复模式 背景尺寸background-sizecontain和cover是两个特殊的background-size的值 背景裁切 background-clip背景固定 background-attachment背景图片位置 background-positio…

LeetCode 590. N 叉树的后序遍历

590. N 叉树的后序遍历 给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。 示例 1: 输入:root [1,null,…

虚拟机配置网络

1开启网络 右击打开属性配置ipv4 配置vm 配置系统 配置liunx网卡信息 vim /etc/sysconfig/network-scripts/ifcfg-ens33 打开电脑任务管理器

1.13寒假集训

晚上兼职下班回来才有时间写题&#xff0c;早上根本起不来 A: 解题思路&#xff1a;我第一开始以为只要满足两个red以上的字母数量就行&#xff0c;但是过不了&#xff0c;后面才发现是red字符串&#xff0c;直接三个三个判断就行。 下面是c代码&#xff1a; #include<io…

【GitHub项目推荐--一行命令下载全网视频】【转载】

项目地址&#xff1a;https://github.com/soimort/you-get 首先声明&#xff0c;请不要使用该项目从事违法活动哦~仅供学习使用&#xff01; 解决痛点 如果你上网的时候看了一些东西不错&#xff0c;想下载下来&#xff0c;或者在线观看喜欢的视频&#xff0c;但是没有找到网…

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(二)

引言&#xff1a;上一篇文章我们简单介绍了AD9129的基础知识&#xff0c;包括芯片的重要特性&#xff0c;外部接口相关的信号特性等。本篇我们重点介绍下项目中FPGA与AD9129互联的原理图设计&#xff0c;包括LVDS IO接口设计、时钟电路以、供电设计以及PCB设计。 LVDS数据接口设…

openssl3.2 - quic服务的运行

文章目录 openssl3.2 - quic服务的运行概述笔记运行openssl编译好的quic服务程序todo - 如果自己编译quic服务工程END openssl3.2 - quic服务的运行 概述 在看 官方 guide目录下的工程. 都是客户端程序, 其中有quic客户端, 需要运行quic服务才行. openssl编译好的目录中有编译…

基于Matlab/Simulink的MIL仿真验证解决方案

文章目录 需求追溯 虚拟环境 模型检查 仿真验证 测试报告 参考文献 针对模型开发阶段的ECU算法&#xff0c;可以很直接地将其与虚拟车辆模型连接起来&#xff0c;通过MIL对其进行验证和确认。可以在开发过程的早期检测到设计错误和不正确的需求&#xff0c;也有助于安全地…

UML-状态机图(状态图)

UML-状态机图&#xff08;状态图&#xff09; 一、状态机图简介1、状态&#xff08;1&#xff09;简单状态&#xff08;2&#xff09;并发状态2、转移&#xff08;1&#xff09;判定决策点&#xff08;2&#xff09;同步&#xff08;分叉与汇合&#xff09; 3、事件4、动作5、活…

C++ 输入用户名和密码 防止注入攻击

1、问题解释&#xff1a;注入攻击 &#xff0c;无密码直接登录数据库 可视化展示 1.1、当你的数据库为&#xff1a;其中包含三个字段id user 以及md5密码 1.2、在使用C堆数据库信息进行访问的时候&#xff0c;使用多条语句进行查询 string sql "select id from t_user…

Unity Shader 属性的定义

Unity Shader 属性的定义 什么是材质球 人的衣服 什么是shader 决定材质跟灯光的作用 Property 若是把shader看作class&#xff0c;那么Property就可以看成成员变量 属性定义的通用格式 Properites{ Property[Property…] } ep:定义一个int&#xff1a; name("dis…

YOLOv5模型转ONNX,ONNX转TensorRT Engine

系列文章目录 第一章 YOLOv5模型训练集标注、训练流程 第二章 YOLOv5模型转ONNX,ONNX转TensorRT Engine 第三章 TensorRT量化 文章目录 系列文章目录前言一、yolov5模型导出ONNX1.1 工作机制1.2 修改yolov5代码&#xff0c;输出ONNX 二、TensorRT部署2.1 模型部署2.2 模型推理…