JavaScript 中实例化生成对象的相关探讨

JavaScript 中实例化生成对象的相关探讨

在 JavaScript 世界中,对象的实例化是一个关键且基础的概念。当我们使用构造函数创建对象时,会引发一系列关于对象之间联系、原型链以及相关概念的思考。

让我们通过一段代码来深入探讨这些问题:

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.say = function () {
        console.log(`${this.name} 今年 ${this.age}`)
    }
    return this;
}

const p1 = new Person('张三', 20);
const p2 = new Person('李四', 30);
p1.say();
p2.say();

当我们实例化两个不同的对象 p1p2 后,它们在表面上看起来是两个独立的个体。然而,通过 console.log(p1.__proto__ === p2.__proto__) 这行代码,我们发现它们的原型对象竟然指向同一个对象,这就引出了我们对原型链等概念的深入探讨。

一、constructor 的意义与作用

每个实例对象在创建时,都会自动拥有一个 constructor 属性,它指向创建该对象的构造函数。

  • 其作用之一是用来记录当前对象的构造函数是谁,方便后续的查找。
  • 可以用来判断当前对象是否为该构造函数的实例。
  • 还能在创建对象时,用于初始化对象。

二、prototype 的意义与作用

prototype 的存在也具有重要意义:

  • 它可以用来记录当前对象的原型是谁,便于进行查找。
  • 能够判断当前对象的原型是谁。
  • 可以获取当前对象的原型。
  • 非常重要的一点是,它可以用来给对象添加共享的方法。
  • 同时在实现继承方面也发挥着关键作用。

三、使用构造函数创建对象的问题及解决方案

使用构造函数创建对象存在一些问题,比如会浪费内存空间,因为每个实例对象都会生成一个相同的函数方法;代码会显得冗余,每个实例对象都有一套相同的函数方法;性能也会较低,因为每次调用方法都要重新创建一遍。

为了解决这些问题,我们可以采用如下方案:

function Person(name, age) {
    this.name = name;
    this.age = age;
    return this;
}
Person.prototype.say = function () {
    console.log(`${this.name} 今年 ${this.age}`)
}
const p1 = new Person('张三', 20);
const p2 = new Person('李四', 30);
p1.say();
p2.say();

这样通过将共享方法挂载到原型对象上,实现了原型共享,有效地解决了上述问题。

四、proto 和原型对象 prototype 的区别

__proto__ 描述的是当前对象的原型是谁,指向的是构造函数的原型对象,它体现的是实例与原型之间的一种类似血缘关系的联系,即因为有这种联系所以继承了相关的特性。

prototype 描述的是模板的一种能力,类似父亲所具有的优良品质。

从下图可以清晰地看出这是一个链式传递的关系:

原型链

不难看出这是一个链式传递的关系,__proto__指向的是原型对象,原型对象指向的是构造函数的原型对象,而构造函数的原型对象指向的是 Object 的原型对象,Object 的原型对象指向的是 null。我们将这个链式传递的关系称之为原型链。

整体展示

通过对这些概念的深入理解和掌握,我们能够更好地在 JavaScript 开发中运用对象的实例化、原型链等特性,编写出更加高效、简洁且易于维护的代码。

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

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

相关文章

MatSci-LLM ——潜力和挑战以及大规模语言模型在材料科学中的应用

概述 大规模语言模型的出现正在从根本上改变技术开发和研究的方式。大规模语言模型不仅对自然语言处理领域产生了重大影响,而且对许多相关领域也产生了重大影响,例如从文本生成图像的计算机视觉(Zhang 等人,2023 年)。…

【C++】C++11特性(上)

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:C 个人主页:Celias blog~ 目录 一、列表初始化 二、std::initializer_list 三、右值引用和移…

Linux(光速安装+ubuntu镜像 serve live-serve desktop)

ubuntu镜像_ubuntu下载地址_ubuntu安装教程-阿里巴巴开源镜像站 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 清华大学的镜像好一点速度比较快! 下载镜像 都是推荐使用服务器版,桌面版一般自己用 amd64 就…

Linux命令详解,全网最详细,看这一篇就够了

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

机器情绪及抑郁症算法

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月12日17点02分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17230869054974 计算机来理解你的情绪&a…

美食网的设计与实现

摘 要 随着科技的发展、生活水平的提升,人们更加注重饮食搭配和饮食健康。通过网络技术来加强美食与健康知识的普及是当前一种可行的措施。通过网页浏览美食网,不仅可以普及每道美食的做法,通过制作美食来缓解心情,还可以通过美…

Ubuntu[无桌面]——修改Docker镜像源文件

下载镜像的时候,一般有两种方式: (1)在宿主主机配置相应的文件/etc/docker/daemon.json,配置镜像源环境地址 (2)进入https://quay.io/search中,输入搜索需要下载的镜像名称&#xff…

ODOO学习笔记(8):模块化架构的优势

灵活性与可定制性 业务流程适配:企业的业务流程往往因行业、规模和管理方式等因素而各不相同。Odoo的模块化架构允许企业根据自身的具体业务流程,选择和组合不同的模块。例如,一家制造企业可以启用采购、库存、生产和销售模块,并通…

Git的使用(基础语句)

首先如果想要使用git的各项功能,我们要下载Git-2.40.1-64-bit.exe这个驱动程序,并安装它,这个资源我没有办法上传是因为有的博主已经上传过了,所以有VIP的或者有钱哥可以去csdn上自行下载,实在不行加我qq我发你4925396…

labview用sql server数据库存取数据到一个单元格

最近有一个项目上需要一个庞大的数据量,需要很多列,但是百度查了一下sqi server最多支持1024列,这一限制适用于大多数表类型,包括常规表,临时表和表变量,要注意的是如果超出这一限制可能会导致数据的完整性…

Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)

作者:来自 Elastic Benjamin Trent Lucene 和 Elasticsearch 中更好的二进制量化 (BBQ)。 嵌入模型输出 float32 向量,通常对于高效处理和实际应用来说太大。Elasticsearch 支持 int8 标量量化,以减小向量大小,同时保持性能。其他…

库打包工具 rollup

库打包工具 rollup 摘要 **概念:**rollup是一个模块化的打包工具 注:实际应用中,rollup更多是一个库打包工具 与Webpack的区别: 文件处理: rollup 更多专注于 JS 代码,并针对 ES Module 进行打包webpa…

2024中国游戏出海情况

01 哪里出海更花钱? 报告显示,中国手游在全球不同市场的获客成本不同,整体来看北美市场竞争更加激烈,其安卓和iOS获客成本是拉丁美洲的12倍和7倍。 按具体市场划分,获客成本最高的TOP 3为韩国、美国和日本&#xff0c…

【达梦数据库】MYSQL迁移到DM字符集转换问题-UTF8mb4|转UTF8(UTF8mb3)

目录 背景现象问题原因原因1:字符集不同原因2:以字节为单位 解决办法方法1:扩大长度 结果验证MYSQLDTSDM 背景 迁移过程环境信息如下: 数据库版本字符集补充MYSQL8.0.xxUTF8mb4DM8.1.3.162UTF8(UTF8mb3的简称&#x…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…

RT-DETR融合[ECCV2024]自调制特征聚合SMFA模块及相关改进思路

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《SMFANet: A Lightweight Self-Modulation Feature Aggregation Network for Efficient Image Super-Resolution》 一、 模块介绍 论文链接:https://link.springer.…

postman变量和脚本功能介绍

1、基本概念——global、collection、environment 在postman中,为了更好的管理各类变量、测试环境以及脚本等,创建了一些概念,包括:globals、collection、environment。其实在postman中,最上层还有一个Workspaces的概…

计算机网络常见面试题(一):TCP/IP五层模型、TCP三次握手、四次挥手,TCP传输可靠性保障、ARQ协议

文章目录 一、TCP/IP五层模型(重要)二、应用层常见的协议三、TCP与UDP3.1 TCP、UDP的区别(重要)3.2 运行于TCP、UDP上的协议3.3 TCP的三次握手、四次挥手3.3.1 TCP的三次握手3.3.2 TCP的四次挥手3.3.3 随机生成序列号的原因 四、T…

约束(MYSQL)

not null(非空) unique(唯一) default(默认约束,规定值) 主键约束primary key(非空且唯一) auto_increment(自增类型) 复合主键 check&#xff08…

Cent OS-7的Apache服务配置

WWW是什么? WWW(World Wide Web,万维网)是一个全球性的信息空间,其中的文档和其他资源通过URL标识,并通过HTTP或其他协议访问。万维网是互联网的一个重要组成部分,但它并不是互联网的全部。互联…