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中一个非常强大的特性,使得对象可以更加灵活和可扩展。

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

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

相关文章

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据,并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

聚醚醚酮(Polyether Ether Ketone)PEEK在粘接使用时可以使用UV胶水吗?要注意哪些事项?

一般情况下,聚醚醚酮(Polyether Ether Ketone,PEEK)是一种难以黏附的高性能工程塑料,而UV胶水通常不是与PEEK进行粘接的首选方法。PEEK表面的化学性质和高温性能使得它对常规胶水的附着性较低。然而,有一些…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下: 基于三球定位的多个火箭残骸的准确定位 针对问题一:为了进行单个残骸的精确定位,确定单个火箭残骸发生音爆 时的精确位置和时间,本文基于三球定位模型,考虑到解的存在性和唯一性, 选取了四个监测…

用HTML5实现播放gif文件

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

清华同方电脑文件删除怎么恢复

在日常使用清华同方电脑的过程中&#xff0c;我们难免会遇到误删重要文件的情况。文件丢失不仅可能导致数据损失&#xff0c;还可能影响到我们的工作、学习甚至是生活。那么&#xff0c;当在清华同方电脑上删除了重要文件后&#xff0c;我们应该如何恢复呢&#xff1f;本文将为…

Linux服务器安全基础 - 查看入侵痕迹

1. 常见系统日志 /var/log/cron 记录了系统定时任务相关的日志 /var/log/dmesg 记录了系统在开机时内核自检的信息&#xff0c;也可以使用dmesg命令直接查看内核自检信息 /var/log/secure:记录登录系统存取数据的文件;例如:pop3,ssh,telnet,ftp等都会记录在此. /var/log/btmp:记…

服务器被攻击,为什么后台任务管理器无法打开?

在服务器遭受DDoS攻击后&#xff0c;当后台任务管理器由于系统资源耗尽无法打开时&#xff0c;管理员需要依赖间接手段来进行攻击类型的判断和解决措施的实施。由于涉及真实代码可能涉及到敏感操作&#xff0c;这里将以概念性伪代码和示例指令的方式来说明。 判断攻击类型 步…

C#---使用Coravel实现定时任务

Coravel是一款框架轻&#xff0c;使用简单&#xff0c;支持秒级定时任务。 1.添加NuGet引用 2.定义自己的工作任务 using Coravel.Invocable; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Thread…

【Java笔记】JVM:对象在内存中是什么样的?如何计算对象占用的内存大小?

文章目录 Java对象的内存布局计算对象占用的内存大小Openjdk jol来算几个Object o new Object() 该对象在内存中占用多少字节&#xff1f;基本数据类型作为成员变量的对象有实例对象作为成员变量的对象 Java对象的内存布局 Java中&#xff0c;一个实例对象在内存中的组成主要包…

国家开放大学2024年春《Matlab语言及其应用》实验五Simulink系统 建模与仿真参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 实验报告 姓名&#xff1a; 学号&#xff1a; 实验五名称…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

大模型公开课-大模型的语言解码游戏学习总结

在当今快速发展的人工智能领域&#xff0c;深度学习作为其中的一项关键技术&#xff0c;正引领着科技的新潮流。而对于初学者来说&#xff0c;了解大型语言模型的解码游戏&#xff0c;对于理解深度学习的基本概念至关重要。本篇博客将对一次关于大型语言模型解码游戏的视频教学…

SQL如何利用Bitmap思想优化array_contains()函数

目录 0 问题描述 1 位图思想 2 案例实战 3 小结 0 问题描述 在工作中&#xff0c;我们往往使用array_contains()函数来进行存在性问题分析&#xff0c;如判断某个数是否在某个数组中&#xff0c;但是当表数据量过多&#xff0c;存在大量array_contains()函数时&#xff0c;…

ollama-python-Python快速部署Llama 3等大型语言模型最简单方法

ollama介绍 在本地启动并运行大型语言模型。运行Llama 3、Phi 3、Mistral、Gemma和其他型号。 Llama 3 Meta Llama 3 是 Meta Inc. 开发的一系列最先进的模型&#xff0c;提供8B和70B参数大小&#xff08;预训练或指令调整&#xff09;。 Llama 3 指令调整模型针对对话/聊天用…

案例分享:使用RabbitMQ消息队列和Redis缓存优化Spring Boot秒杀功能

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

神经网络与深度学习(四)--自然语言处理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.序列模型 分类问题与预测问题 图像分…

FSD自动驾驶泛谈

特斯拉的FSD&#xff08;Full-Self Driving&#xff0c;全自动驾驶&#xff09;系统是特斯拉公司研发的一套完全自动驾驶系统。旨在最终实现车辆在多种驾驶环境下无需人类干预的自动驾驶能力。以下是对FSD系统的详细探讨&#xff1a; 系统概述 FSD是特斯拉的自动驾驶技术&…

Java 基础重点知识-(Java 语言特性、数据类型、常见类、异常)

文章目录 Java 语言特性形参和实参的区别是什么?值传递和引用传递的区别?Java 是值传递还是引用传递?final 的作用是什么?final finally finalize 有什么不同?static 的作用是什么?static 和 final 的区别是什么? Java 数据类型Java基本数据类型有几种? 各占多少位?基…

Isaac Sim 2 (学习笔记4.26)

今天一整天都要开会&#xff0c;闲的无聊&#xff0c;把这周学的东西简单整理下。纯英文文档想不起来东西的时候总是找不到位置...持续更新一整天 1.将块与块连接起来 尝试连接块与块的时候发现只能是cube、mesh连接&#xff0c;如果是一整个的包括坐标系、材质包等等&#xf…

iBarcoder for Mac:一站式条形码生成软件

在数字化时代&#xff0c;条形码的应用越来越广泛。iBarcoder for Mac作为一款专业的条形码生成软件&#xff0c;为用户提供了一站式的解决方案。无论是零售、出版还是物流等行业&#xff0c;iBarcoder都能轻松应对&#xff0c;助力用户实现高效管理。 iBarcoder for Mac v3.14…