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

news2025/2/26 3:55:44

🧑‍🎓 个人主页:《爱蹦跶的大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的工作原理、特性以及如何共同应用它们实现面向对象编程。这篇博客内容偏理论和概念性,如果需要的话可以补充更多具体代码案例进行辅助说明。请检查是否需要修改或补充解释某些部分。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java poi导出excel合并单元格

导出效果 代码: import java.math.BigDecimal;public class CwmonthlyPlanSub0Bean {/*** 主键*/private Long id;/*** 付款类*/private String fkl;/*** 付款事项*/private String fksx;/*** 本期预算金额*/private BigDecimal bqysje;/*** * 电汇金额*/private B…

CSS 弹幕按钮动画

<template><view class="content"><button class="btn-23"><text class="text">弹幕按钮</text><text class="marquee">弹幕按钮</text></button></view></template><…

移动硬盘无法识别处理办法

今天这里做一下总结&#xff0c;我现在手上有一个移动硬盘&#xff0c;插入win10电脑是有盘号的&#xff0c;但是 但是点击就出问题 解决办法 安装DiskGenius 下载网址在https://www.diskgenius.cn/download.php 下载之后解压安装就行&#xff0c;非常简单&#xff0c;然后…

Provide/Inject 依赖注入(未完待续)

父组件传递给子组件数据&#xff0c;通过props&#xff0c;但是需要逐层传递 provide/Inject 的推出就是为了解决这个问题&#xff0c;它提供了一种组件之间共享此类值的方式,不必通过组件树每层级显示地传递props 目的是为了共享那些被 认为对于一个组件树而言是全局的数据 p…

【LeetCode: 57. 插入区间+分类讨论+模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

12.3在应用层使用SPI总线

在SPI总线驱动框架中提供了一个spidev 的字符设备驱动&#xff0c;在应用层可以通过它来访问SPI总线。 应用层访问SPI总线的步骤 编写spidev设备树节点&#xff0c;在SPI总线的设备树节点下添加spidev设备的树节点&#xff0c;设备树示例如下所示&#xff1a; spidev0: spid…

ASCII编码:计算机文本通信的基石

ASCII&#xff08;美国信息交换标准代码&#xff09;编码是一种将字符与数字相互映射的编码系统&#xff0c;它为现代计算机文本通信奠定了基础。本文将从多个方面介绍ASCII编码的原理、发展历程、应用及其在现实场景中的优势&#xff0c;帮助您深入了解这一重要的编码技术。 …

C++进阶--红黑树

红黑树 一、红黑树的概念二、红黑树的性质三、红黑树结点的定义四、红黑树的插入五、红黑树的验证七、红黑树的查找七、红黑树与AVL树的比较七、完整代码RBTree.h 一、红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色…

QT -狗狗管理工具

QT -狗狗管理工具 一、演示效果二、UML三、关键代码四、程序链接 一、演示效果 二、UML 三、关键代码 #include <QFrame> #include <QHBoxLayout> #include <QVBoxLayout> #include <QLabel> #include <QSizePolicy> #include <QDialog> …

【深度学习每日小知识】Computer Vision 计算机视觉

计算机视觉是人工智能的一个领域&#xff0c;涉及算法和系统的开发&#xff0c;使计算机能够解释、理解和分析来自周围世界的视觉数据。这包括从静态图像到视频流甚至 3D 环境的一切。 使用对象检测和特征提取等方法&#xff0c;计算机视觉本质上需要从视觉输入中提取有用信息…

大模型微调及生态简单介绍

大模型 大模型生态OpenAI大模型生态&#xff1a; 全球开源大模型性能评估榜单中文语言模型——ChatGLM基于ChatGLM的多模态⼤模型 大模型微调LLM⼤语⾔模型 ⼀般训练过程为什么需要微调高效微调技术⽅法概述⾼效微调⽅法一&#xff1a;LoRA微调方法高效微调⽅法⼆&#xff1a;P…

linux 网络设置

查看linux基础的网络配置 命令 网关route -nip 地址ifconfig / ip aDNS 服务器cat /etc/resolv.conf主机名hostname路由route -n网络连接状态ss / netstat 一&#xff0c;ifconfig 查看网络接口信息 &#xff08;一&#xff09;ifconfig …

C++|68.虚析构函数

文章目录 虚析构函数诞生的背景问题若创造一个子类的对象&#xff0c;并使用一个父类的指针指向/管理它&#xff0c;结果会如何解决方案——虚析构函数 虚析构函数诞生的背景 Derived继承了Base&#xff0c;Derived本身自带析构函数&#xff0c;而由于继承了Base&#xff0c;De…

openssl3.2 - quic服务的运行

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

【Python】数据可视化--基于TMDB_5000_Movie数据集

一、数据准备 tmdb_5000_movie数据集下载 二、数据预处理 观察数据集合情况 import pandas as pd import ast import warnings warnings.filterwarnings(ignore) # 加载数据集 df pd.read_csv(tmdb_5000_movies.csv) # 查看数据集信息 print(df.info()) 由于原数据集包含的…

DM数据库安装注意事项

数据库安装注意事项 一、安装前 一些参数需要在数据库创建实例前找用户确认。 参数名参数掩码参数值备注数据页大小PAGE_SIZE32数据文件使用的页大小(缺省使用8K&#xff0c;建议默认&#xff1a;32)&#xff0c;可以为 4K、8K、16K 或 32K 之一&#xff0c;选择的页大小越大…

UCB Data100:数据科学的原理和技巧:第十六章到第十八章

十六、交叉验证和正则化 Cross Validation and Regularization 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 学习成果 认识到需要验证和测试集来预览模型在未知数据上的表现 应用交叉验证来选择模型超参数 了解 L1 和 L2 正则化的概念基础 在特征工程讲座结束时…

QT上位机开发(进度条操作)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 进度条是一个比较常见的控件。如果某个操作需要很长的时间才能完成&#xff0c;那么这个时候最好有一个进度条提示&#xff0c;这样比较容易平复一…

鸿蒙(HarmonyOS)应用开发指南

1. 概述 1.1 简介 鸿蒙&#xff08;即 HarmonyOS &#xff0c;开发代号 Ark&#xff0c;正式名称为华为终端鸿蒙智能设备操作系统软件&#xff09;是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电…

centos 7 上如何安装chrome 和chrome-driver

centos 7 上如何安装chrome 和chrome-driver 查找自己的服务器是什么系统 cat /etc/os-release这里以centos linux 7为例 下载google-chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm安装chrome sudo yum localinstall go…