JavaScript原型、原型对象、原型链系列详解(三)

(三)、JavaScript原型链

原型链

在 JavaScript 中,对象之间的继承是通过原型链来实现的。每个对象都有一个指向原型对象的内部链接,也就是 [[Prototype]] 属性。这个链接的作用是如果对象本身没有某个属性或方法,就会去它的原型对象上找,如果还没有,就会去原型对象的原型对象上找,以此类推,直到找到为止。这就形成了原型链。

原型链的实现

在 JavaScript 中,我们可以通过构造函数来创建一个对象,每个构造函数都有一个 prototype 属性,它指向一个对象,这个对象就是新对象的原型对象。通过 new 关键字调用构造函数时,会创建一个新的对象,并将它的原型对象指向构造函数的 prototype 属性所指向的对象。

下面是一个例子:

// 定义一个构造函数
function Person(name) {
  this.name = name;
}

// 定义构造函数的原型对象
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

// 创建一个对象
const person = new Person('John');

// 调用对象的方法
person.sayHello(); // 输出 "Hello, my name is John"

在这个例子中,Person 构造函数有一个 prototype 属性,指向一个对象,这个对象有一个 sayHello 方法。当我们通过 new 关键字调用 Person 构造函数时,会创建一个新对象 person,并将它的原型对象指向 Person.prototype 所指向的对象。

因此,当我们调用 person.sayHello() 方法时,JavaScript 引擎会首先查找 person 对象本身是否有 sayHello 方法,如果没有,就会去它的原型对象 Person.prototype 上查找,如果还没有,就会去 Person.prototype 的原型对象 Object.prototype 上查找,以此类推,直到找到为止。

原型链的示意图

下面是一个原型链的示意图:

        +-------------+
        |   Object    |
        +-------------+
               ^
               |
        +-------------+
        |  Prototype  |
        +-------------+
               ^
               |
        +-------------+
        |  Prototype  |
        +-------------+
               ^
               |
        +-------------+
        |  Prototype  |
        +-------------+
               ^
               |
        +-------------+
        |   Person    |
        +-------------+
               ^
               |
        +-------------+
        |  Prototype  |
        +-------------+
               ^
               |
        +-------------+
        |  Prototype  |
        +-------------+
               ^
               |
           +-------+
           |  john |
           +-------+


以上代码示例展示了一个简单的原型链,其中:

  1. Object是所有对象的基类,也是原型链的起点;

  2. 每个对象都有一个Prototype属性,指向它的原型对象;

  3. 原型对象也有一个Prototype属性,指向它的原型对象;

  4. 原型对象最终指向Object.prototype;

  5. 通过原型链的方式,子类可以访问父类原型上的属性和方法;

  6. 在上述示例中,john对象通过原型链可以访问到Person.prototype和Object.prototype上的属性和方法。

接下来我们来看一个实际的例子,更好地理解原型链的实现。

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

Person.prototype.sayHello = function() {
  console.log("Hello, my name is " + this.name);
};

function Student(name, major) {
  this.name = name;
  this.major = major;
}

// 设置 Student 的原型对象为 Person 的实例
Student.prototype = new Person();

Student.prototype.sayMajor = function() {
  console.log("My major is " + this.major);
};

var student1 = new Student("Alice""Mathematics");

student1.sayHello(); // "Hello, my name is Alice"
student1.sayMajor(); // "My major is Mathematics"

在这个例子中,我们定义了 Person 和 Student 两个构造函数,并且让 Student 的原型对象指向 Person 的一个实例。这个实例就构成了一个原型链,它包含了 Student.prototype、Person.prototype 和 Object.prototype 三个节点,构成了一个链式结构。

当我们调用 student1.sayHello() 方法时,JavaScript 引擎首先在 student1 实例中查找 sayHello() 方法,发现没有找到,于是它继续在 Student.prototype 中查找,仍然没有找到,接着在 Person.prototype 中查找,这次找到了 sayHello() 方法并调用。当调用完 sayHello() 方法后,程序继续执行 student1.sayMajor() 方法,这次 JavaScript 引擎会在 student1 实例中查找 sayMajor() 方法,没有找到,接着在 Student.prototype 中查找,找到了 sayMajor() 方法并调用。

这个例子展示了原型链的实际应用,通过原型链,我们可以在子类中访问父类的属性和方法,并且可以在子类中扩展新的属性和方法。原型链也是 JavaScript 中继承的基础实现机制之一。

最后再给出一个简单的总结:原型链是由原型对象构成的链式结构,JavaScript 引擎在查找属性或方法时会沿着原型链逐级查找,直到找到或者查找到顶层为止。

共享资源关注公众号获取

alt

本文由 mdnice 多平台发布

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

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

相关文章

Linux 进程通信:匿名管道、实现进程池

目录 一、进程间通信 1、 为什么需要进程通信 2、发展和分类 二、管道 1、概念 2、特点 2、复制并共享 3、用fork来共享管道原理 4、站在文件描述符角度-深度理解管道 5、站在内核角度-管道本质 三、匿名管道 1、概念 2、创建 3、snprintf 4、父子进程中进行单…

小程序英文口语发音评测

一、英文口语评测需求 在全球化的今天,英语已经成为了世界上最重要的国际语言之一。无论是在国际商务、科技研究、教育还是日常生活中,英语都扮演着举足轻重的角色。因此,掌握英文口语的能力对于个人的职业发展、学术研究以及跨文化交流都具…

【Linux】vim配置及安装方法

注 安装方法在文章最后 配置文件的位置 在目录 /etc/ 下面,有个名为vimrc的文件,这是系统中公共的vim配置文件,对所有用户都有效。而在每个用户的主目录下,都可以自己建立私有的配置文件,命名为“.vimrc”。例如&…

atoi函数详解

atoi函数使用方法 在c官网中是这样介绍atoi函数的 通俗的讲就是把字符串中的字符数字转换为整形数字,遇到空格就跳过,如果在字符串开始遇到不是有效的整数比如说abc就直接返回0,如果遇到像这种情况123abc345这个就只返回123,这个…

C语言数据结构之计数排序

世中逢尔 雨中逢花 目录 计数排序的介绍 代码展示 时间复杂度和空间父复杂度 计数排序的用途 计数排序的局限性 计数排序的介绍 排序原理 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 是一个不比较排序算法,通过计数将时间复杂度降到了O…

大型网站集群管理负载均衡

课程介绍 结合企业大规模应用,解决应用高并发问题,解决单节点故障问题,缓存数据库的应用。学完掌握知识点:企业应用实现四七层负载均衡,以及Nginx等应用的高可用性,Redis缓存数据库的部署应用以及高可用方…

【Redis】优惠券秒杀

全局唯一ID 全局唯一ID生成策略: UUIDRedis自增snowflake算法数据库自增 Redis自增ID策略:每天一个key,方便统计订单量ID构造是 时间戳 计数器 Component public class RedisIdWorker {// 2024的第一时刻private static final long BEGIN…

Unity 背包系统中拖拽物体到指定位置或互换位置效果的实现

在Unity中,背包系统是一种常见的游戏系统,可以用于管理和展示玩家所持有的物品、道具或装备。 其中的拖拽功能非常有意思,具体功能就是玩家可以通过拖拽物品图标来移动物品在背包中的位置,或者将物品拖拽到其他位置或界面中&…

29双体系Java学习之编程的基本过程和类的通用格式

编程的基本过程 类的通用格式 ★小贴士 类的设计应遵循单一职责原则(SRP),即只能让一个类有且仅有一个职责,以保证修改的可能性尽量少。

DEll R440 LC下的硬件日志收集步骤(注意:此方法收集的日志里无操作系统的日志);

一, LC下的硬件日志收集步骤(注意:此方法收集的日志里无操作系统的日志); 开机看到屏幕左上角出现F10的提示的时候,敲击F10,进入LC的界面: 找到U盘的类似文件,就是最终生…

无人驾驶中的坐标转换

无人驾驶中的坐标转换 无人车上拥有各种各样的传感器,每个传感器的安装位置和角度又不尽相同。对于传感器的提供商,开始并不知道传感器会以什么角度,安装在什么位置,因此只能根据传感器自身建立坐标系。无人驾驶系统是一个多传感器…

Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程

文章目录 Windows/Linux-openEuler系统使用路由侠内网穿透,部署项目详细教程一、在windows系统下载安装路由侠并实现项目部署1、下载路由侠并注册安装到Windows系统2、点击内网映射,添加映射,注册域名前缀3、选择网站应用4、配置你想要代理项…

ubuntu上一款好用的串口工具screen

看名字,你猜他是什么? 安装 sudo apt install screen 然后将USB串口接到虚拟机,执行dmesg命令查看串口设备名: 测试: sudo screen /dev/ttyUSB0 115200确实很简单。

数据结构(五)——树森林

5.4 树和森林 5.4.1 树的存储结构 树的存储1:双亲表示法 用数组顺序存储各结点,每个结点中保存数据元素、指向双亲结点(父结点)的“指针” #define MAX_TREE_SIZE 100// 树的结点 typedef struct{ElemType data;int parent; }PTNode;// 树的类型 type…

【Godot4.2】像素直线画法及点求取函数

概述 基于CanvasItem提供的绘图函数进行线段绘制只需要直接调用draw_line函数就可以了。 但是对于可以保存和赋值节点直接使用的纹理图片,却需要依靠Image类。而Image类没有直接提供基于像素的绘图函数。只能依靠set_pixel或set_pixelv进行逐个像素的填色。 所以…

C++项目——集群聊天服务器项目(三)muduo网络库

今天来介绍集群聊天器项目中网络模块代码的核心模块——muduo网络库,一起来看看吧~ 环境搭建C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客 Json第三方库C项目——集群聊天服务器项目(二)Json第三方库…

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢?2.人为什么要发明工具,进行进化呢?3.人是如何发明工具的?4.为什么要有不同的岗位和行业? 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Xilinx高级调试方法--多卡调试

Xilinx高级调试方法--多卡调试 1 测试工程2 驱动修改3 工程测试 本文主要介绍基于XVC技术实现多卡调试的方法 1 测试工程 加速卡1 Verdor ID:1BD4Device ID:903E 加速卡2 Verdor ID:1BD4Device ID:903F 2 驱动修改 为了同时识…

大数据技术原理与应用 01.大数据概述

不可以垂头丧气,会显矮 —— 24.3.24 参考学习:厦门大学 林子雨老师 大数据技术原理与应用 一、大数据时代 大数据概念、影响、应用、关键技术 大数据与云计算、物联网的关系 ①三次信息化浪潮时代 ②第三次信息化浪潮的技术支撑 1>存储设备容量不断…

ARM:按键中断

key_inc.c #include"key_inc.h"void key1_it_config(){//使能GPIOF外设时钟RCC->MP_AHB4ENSETR | (0x1<<5);//将PF9设置为输入模式GPIOF->MODER & (~(0x3<<18));//设置由PF9管脚产生EXTI9事件EXTI->EXTICR3 & (~(0XFF<<8));EXTI…