JavaScript原型链深度剖析

目录

前言

一、原型链

1.原型链的主要组成

        原型(Prototype)

        构造函数(Constructor)

        实例(Instance)

2.原型链的工作原理

前言

        在JavaScript的世界中,原型链(Prototype Chain)是一个核心概念,它决定了对象如何继承属性和方法。对于初学者来说,理解原型链可能是个挑战,但一旦掌握了它,就能更好地利用JavaScript的动态性和灵活性。本篇文章将详细探讨JavaScript的原型链,帮助大家深入理解其工作原理。

一、原型链

        原型链是JavaScript中用来实现对象继承的一种机制。每个JavaScript对象都有一个内部链接到另一个对象,这个对象就是它的原型(prototype)。当试图访问一个对象的某个属性时,如果这个对象自身没有这个属性,那么JavaScript就会在这个对象的原型上查找这个属性,依此类推,一直向上查找,直到找到一个包含该属性的对象或者到达原型链的末尾(null)。这个过程就构成了原型链。

        每个JavaScript函数都有一个prototype属性,这个属性是一个指向一个对象的引用。当创建一个新对象(使用new关键字)时,这个新对象的内部[[Prototype]]链接(在ES6之前,这个链接是不可见的,但可以通过Object.getPrototypeOf()访问)会指向构造函数的prototype对象。

1.原型链的主要组成

        原型(Prototype)

        在JavaScript中,每个对象都有一个内部链接指向它的原型对象。原型对象的作用就是提供共享的方法和属性给所有实例。当我们试图访问一个对象的某个属性时,如果该对象自身没有这个属性,那么JavaScript就会在该对象的原型上查找这个属性,这就是原型链查找机制。通过这种方式,我们可以实现属性的继承和共享,减少内存占用。

        构造函数(Constructor)

        构造函数是一种特殊的函数,主要用来初始化新创建的对象。当我们使用new关键字创建一个对象时,JavaScript会调用一个构造函数来初始化这个新对象。构造函数通常与new一起使用,用来创建特定类型的对象。构造函数的主要任务是定义实例的属性和方法。

        实例(Instance)

实例是通过构造函数创建出来的具体对象。每个实例都是独一无二的,拥有自己的属性和方法。这些属性和方法可能继承自原型,也可能是在构造函数中定义的。实例与构造函数之间通过this关键字来建立联系,使得实例可以访问到构造函数中定义的属性和方法。

2.原型链的工作原理

        以下是一个具体的例子,通过构造函数、原型和实例来详细解释JavaScript中原型链的工作原理:

// 定义一个构造函数 Person  
function Person(name, age) {  this.name = name;  this.age = age;  
}  // 为 Person 的原型添加方法  
Person.prototype.greet = function() {  console.log('Hello, my name is ' + this.name + ' and I am ' + this.age + ' years old.');  
};  // 创建一个 Person 的实例  
var john = new Person('John', 30);  // 调用实例上的方法  
john.greet(); // 输出: Hello, my name is John and I am 30 years old.

        在这个例子中,我们有一个Person构造函数,它接受两个参数nameage,并在this(即新创建的对象实例)上设置这两个属性。

        接下来,我们向Person.prototype添加了一个greet方法。这意味着所有通过Person构造函数创建的实例都将能够访问这个方法,即使这个方法不是直接在实例上定义的。

当我们调用new Person('John', 30)时,JavaScript做了以下几件事:

  1. 创建了一个新的空对象。
  2. 将这个新对象的内部[[Prototype]]链接(在ES5之前是非标准属性,但在ES6中可以通过Object.getPrototypeOf()访问)设置为Person.prototype
  3. 将这个新对象作为this的上下文,执行Person函数中的代码,设置nameage属性。
  4. 返回这个新创建的对象(除非Person函数返回了另一个对象)。

        因此,john对象现在有两个属性(nameage),并且可以访问Person.prototype上的greet方法。这是通过原型链实现的:当尝试访问john.greet时,JavaScript首先在john对象自身上查找greet属性,如果没有找到,它会沿着john[[Prototype]]链接(即Person.prototype)继续查找,最终找到了greet方法并执行它。

        如果我们在Person.prototype上添加更多的方法或属性,所有已经创建的Person实例以及未来创建的实例都将能够访问这些新方法或属性,因为它们共享同一个原型对象。

        原型链的概念允许我们实现继承,并且可以动态地向对象添加新的功能,而无需修改已存在的对象。这是JavaScript中一个非常强大的特性,使得对象可以更加灵活和可扩展。

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

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

相关文章

R语言的学习——day1

将数据框中某一列数据改成行名 代码 结果

.net core ef 连表查询

Information和TypeInfo连表查询 类似: select st.Title1,si.* from [Star_Information] si left join Star_TypeInfo st on si.typeId2st.id 先在EfCoreDbContext.cs配置 protected override void OnModelCreating(ModelBuilder builder){base.OnModelCreating(b…

基于SSM的文物管理系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的文物管理系统拥有俩种角色 管理员:个人信息管理、用户管理、分类管理、文物信息管理、文物外借管理、文物维修管理、留言板管理等 用户:登录注册、分类…

[华为OD] C卷 服务器cpu交换 现有两组服务器QA和B,每组有多个算力不同的CPU 100

题目: 现有两组服务器QA和B,每组有多个算力不同的CPU,其中A[i]是A组第i个CPU的运算能 力,B[i]是B组第i个CPU的运算能力。一组服务器的总算力是各CPU的算力之和。 为了让两组服务器的算力相等,允许从每组各选出一个CPU进行一次交换。 求两…

Linux 权限的简单讲解

1、前言 当我们分别使用 touch、mkdir 命令创建一名为 test1 的文件和名为 test2 的目录,发现其中有些参数不一样,本文就来给大家来剖析一下。 2、 参数讲解 我们可以通过切片分为下面几个区域,本文就只简单讲解文件类型、权限、所属用户、所…

CGAL 网格热力图

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里实现一个很有趣的功能,生成网格热力图,思路其实很简单:通过指定一个点,计算网格其他点到指定点的测地线距离,以此来为每个网格顶点进行赋色即可。 二、实现代码 //CGAL #include <CGAL/Simple_cartesi…

用HTML5实现播放gif文件

用HTML5实现播放gif文件 在HTML5中&#xff0c;你可以使用<img>标签来播放GIF文件。GIF文件本质上是一种图像格式&#xff0c;它支持动画效果&#xff0c;因此当在网页上加载时&#xff0c;它会自动播放动画。先看一个简单的示例&#xff1a; <!DOCTYPE html> &l…

Elasticsearch:探索 11 种流行的机器学习算法

作者&#xff1a;来自 Elastic Elastic Platform Team 过去几年中&#xff0c;机器学习&#xff08;ML&#xff09;已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐&#xff0c;到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

2024年第二十六届“华东杯”(B题)大学生数学建模挑战赛|数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 让我们来看看华东杯 (B题&#xff09;&#xff01; 第一个问题…

神经网络与深度学习(四)--自然语言处理NLP

这里写目录标题 1.序列模型2.数据预处理2.1特征编码2.2文本处理 3.文本预处理与词嵌入3.1文本预处理3.2文本嵌入 3.RNN模型3.1RNN概要3.2RNN误差反传 4.门控循环单元&#xff08;GRU&#xff09;4.1GRU基本结构 5.长短期记忆网络 (LSTM) 1.序列模型 分类问题与预测问题 图像分…

java版本共存与fastjson反序列化rmi服务器的搭建

文章目录 java 8下载远程加载类工具编译工具mvn多版本共存配置mvn编译marshalsec编译rce文件利用marshalsec加载远程RCE类 java 8下载 链接&#xff1a;https://pan.baidu.com/s/1B8U9v8QAe4Vc67Q84_nqcg?pwd0000 提取码&#xff1a;0000 远程加载类工具 https://github.co…

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:

(Microsoft SQL Server,错误: 233)

错误信息: A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server&#xff0c;错误: 233) 原因&…

vue 设置输入框只能输入数字且只能输入小数点后两位,并且不能输入减号

<el-input v-model.trim"sb.price" placeholder"现价" class"input_w3" oninput"valuevalue.replace(/[^0-9.]/g,).replace(/\.{2,}/g,.).replace(/^(\-)*(\d)\.(\d\d).*$/,$1$2.$3)"/> 嘎嘎简单、、、、、、、、、

自定义之道:学习 Java 中如何打磨独特的异常

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

智能科技的飞跃:LLAMA3引领的人工智能新时代

大家好&#xff01;相信大家对于AI&#xff08;人工智能&#xff09;的发展已经有了一定的了解&#xff0c;但你是否意识到&#xff0c;到了2024年&#xff0c;AI已经变得如此强大和普及&#xff0c;带来了我们从未想象过的便利和创新呢&#xff1f;让我们一起来看看AI在这个时…

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式&#xff0c;它提供了许多强大的功能&#xff0c;特别适合汽车行业的企业使用。 3D看车可实现哪些功能&#xff1f; 1、细节展示&#xff1a; 51建模网提供全套汽车行业3D数字化解决方案&#xff0c;3D看车能够将汽车展示得更加栩栩如生&…

maven聚合,继承等方式

需要install安装到本地仓库&#xff0c;或者私服&#xff0c;方可使用自己封装项目 编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;发布 parent: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mav…

Open CASCADE学习|BRepFill_SectionPlacement

BRepFill_SectionPlacement 是一个与计算机辅助设计&#xff08;CAD&#xff09;相关的术语&#xff0c;通常用于指代一个几何对象或操作&#xff0c;它是Open CASCADE Technology&#xff08;OCCT&#xff09;中的一个类。Open CASCADE Technology是一个开源的CAD内核&#xf…

在AndroidStudio创建Flutter项目并运行到模拟器

1.Flutter简介 Flutter是Google开源的构建用户界面&#xff08;UI&#xff09;工具包&#xff0c;帮助开发者通过一套代码库高效构建多平台精美应用&#xff0c;支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费&#xff0c;拥有宽松的开源协议&#xff0c;适合商…