揭秘原型链:探索 JavaScript 面向对象编程的核心(上)

news2025/1/25 4:48:46

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 原型链的定义和背景
    • 原型链在 JavaScript 中的重要性
  • 二、原型链的基本概念
    • 对象原型
    • 原型链的结构
  • 三、原型链的工作原理
    • 继承和属性共享
    • 原型链的查询过程
  • 四、原型链的应用

一、引言

原型链的定义和背景

原型链是 JavaScript 中一种用于实现继承和共享属性的机制
它基于原型对象和原型链的概念,允许对象之间共享属性和方法。

在 JavaScript 中,每个对象都有一个原型对象Prototype),它是一个包含该对象的属性和方法的对象。当你访问一个对象的属性或方法时,如果该对象本身没有定义这个属性或方法,那么 JavaScript 会沿着原型链向上查找,直到找到定义了该属性或方法的原型对象。

原型链的背景是为了实现继承和代码复用。在 JavaScript 中,没有像其他面向对象语言中的类继承机制,而是通过原型链来实现继承。通过将一个对象的原型对象设置为另一个对象,就可以实现继承,从而使子对象可以访问父对象的属性和方法。

原型链的工作方式可以用下面的图来表示:

Object ---> Person ---> Employee

在这个例子中,PersonEmployee 的原型对象,Employee 可以访问 Person 中的属性和方法。同样,Object 是所有对象的原型对象,因此 PersonEmployee 都可以访问 Object 中的属性和方法。

原型链是 JavaScript 中非常重要的概念,它对于实现继承、代码复用和对象的扩展都非常有用。理解原型链的工作原理对于深入理解 JavaScript 的面向对象编程特性非常重要。

原型链在 JavaScript 中的重要性

原型链在 JavaScript 中具有重要的作用,主要体现在以下几个方面:

  1. 实现继承:原型链是 JavaScript 中实现继承的主要机制。通过将一个对象的原型对象设置为另一个对象,可以实现子对象继承父对象的属性和方法。这种继承方式可以实现代码的复用和扩展,提高了开发效率。

  2. 共享属性和方法:原型链允许对象之间共享属性和方法。当多个对象需要共享相同的属性或方法时,可以将这些属性或方法定义在一个原型对象中,然后将该原型对象作为这些对象的原型。这样,所有的子对象都可以访问和使用这些共享的属性和方法,避免了代码的重复定义。

  3. 动态扩展对象:原型链使得对象可以在运行时动态地扩展。通过向原型对象中添加属性或方法,可以在不修改原始对象的情况下为其添加新的功能。这种动态扩展对象的能力提高了代码的灵活性和可维护性。

  4. 理解面向对象编程:原型链是理解 JavaScript 面向对象编程的关键概念之一。它提供了一种不同于其他面向对象语言中的类继承机制的方式,帮助开发者更好地理解 JavaScript 中的对象、属性和方法的关系。

在这里插入图片描述

总之,原型链在 JavaScript 中扮演着重要的角色,它提供了一种灵活、高效的方式来实现继承、共享属性和方法,以及动态扩展对象。理解原型链对于深入理解 JavaScript 的面向对象编程特性和开发高效的 JavaScript 代码非常重要。

二、原型链的基本概念

对象原型

在 JavaScript 中,对象原型(Object Prototype)是指一个对象用于定义其他对象的属性和方法的模板。每个对象都有一个关联的原型对象,它可以被用来共享属性和方法,从而实现继承和代码复用。

当你创建一个新的对象时,它会自动继承其原型对象的属性和方法。你可以通过对象的 __proto__ 属性来访问其原型对象,也可以通过 Object.getPrototypeOf() 方法来获取对象的原型对象。

原型对象本身也是一个对象,它可以有自己的属性和方法。当你访问一个对象的属性或方法时,如果该对象本身没有定义这个属性或方法,JavaScript 会沿着原型链向上查找,直到找到定义了该属性或方法的原型对象。

通过原型链,你可以实现对象之间的继承。一个对象可以将另一个对象作为其原型,从而继承该对象的属性和方法。这种继承方式与其他面向对象语言中的类继承机制不同,它是基于原型对象的继承。

原型链在 JavaScript 中非常重要,它是实现继承、共享属性和方法、动态扩展对象等功能的基础。理解原型链对于深入理解 JavaScript 的面向对象编程特性和开发高效的 JavaScript 代码非常重要。

原型链的结构

原型链是一个由对象和它们的原型对象组成的链,用于实现继承和共享属性和方法。

下面是一个简单的示例来展示原型链的结构:

// 创建一个 Person 类
function Person(name, age) {
  this.name = name;
  this.age = age;
}

// 创建一个 Employee 类,继承自 Person 类
function Employee(salary) {
  Person.call(this, "John", 30); // 调用 Person 类的构造函数
  this.salary = salary;
}

// 为 Person 类添加一个方法
Person.prototype.getInfo = function() {
  return `姓名:${this.name},年龄:${this.age}`;
};

// 为 Employee 类添加一个方法
Employee.prototype.getSalary = function() {
  return this.salary;
};

// 创建 Person 对象和 Employee 对象
const person = new Person("John", 30);
const employee = new Employee(5000);

// 访问对象的属性和方法
console.log(person.getInfo()); // 输出:姓名:John,年龄:30
console.log(employee.getInfo()); // 输出:姓名:John,年龄:30
console.log(employee.getSalary()); // 输出:5000

在这个示例中,我们创建了两个类:PersonEmployeeEmployee 类继承自 Person 类,通过调用 Person 类的构造函数来初始化 Employee 对象的属性。

每个类都有一个原型对象,它是一个用于共享属性和方法的模板。在这个例子中,Person.prototypeEmployee.prototype 分别是 Person 类和 Employee 类的原型对象。

当我们创建 personemployee 对象时,它们会自动继承其类的原型对象的属性和方法。因此,person 对象可以访问 Person.prototype 上的 getInfo 方法,而 employee 对象可以访问 Person.prototype 上的 getInfo 方法以及 Employee.prototype 上的 getSalary 方法。

原型链的结构可以用下面的图来表示:

Person.prototype -> Person
Employee.prototype -> Person.prototype -> Object.prototype -> null
person -> Employee.prototype -> Person.prototype -> Object.prototype -> null
employee -> Employee.prototype -> Person.prototype -> Object.prototype -> null

在这个图中,每个对象都有一个指向其原型对象的指针(__proto__ 属性),从而形成了一个原型链。当访问一个对象的属性或方法时,如果该对象本身没有定义这个属性或方法,JavaScript 会沿着原型链向上查找,直到找到定义了该属性或方法的原型对象。

通过原型链,我们可以实现继承、共享属性和方法、动态扩展对象等功能。理解原型链对于深入理解 JavaScript 的面向对象编程特性和开发高效的 JavaScript 代码非常重要。

三、原型链的工作原理

继承和属性共享

在 JavaScript 中,继承和属性共享是通过原型链实现的。

继承是指一个类(子类)可以从另一个类(父类)中继承属性和方法。子类可以访问父类的属性和方法,并且可以根据需要覆盖或扩展这些属性和方法。在上面的示例中,Employee 类从 Person 类继承了属性和方法,因此 employee 对象可以访问 Person 类的属性和方法。

属性共享是指多个对象可以共享相同的属性和方法。这是通过原型对象实现的。原型对象是一个用于共享属性和方法的模板,所有的子类对象都可以访问原型对象上的属性和方法。在上面的示例中,Person.prototypeEmployee.prototype 分别是 Person 类和 Employee 类的原型对象,它们用于共享属性和方法。

当我们创建 personemployee 对象时,它们会自动继承其类的原型对象的属性和方法。因此,person 对象可以访问 Person.prototype 上的 getInfo 方法,而 employee 对象可以访问 Person.prototype 上的 getInfo 方法以及 Employee.prototype 上的 getSalary 方法。

通过原型链,我们可以实现继承和属性共享,从而提高代码的复用性和可扩展性。理解原型链对于深入理解 JavaScript 的面向对象编程特性和开发高效的 JavaScript 代码非常重要。

原型链的查询过程

原型链的查询过程是指当访问一个对象的属性或方法时,JavaScript 会沿着原型链向上查找,直到找到定义了该属性或方法的原型对象。

以下是一个简单的示例来演示原型链的查询过程:

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

Person.prototype.getInfo = function() {
  return `姓名:${this.name},年龄:${this.age}`;
};

function Employee(salary) {
  Person.call(this, "John", 30); // 调用 Person 类的构造函数
  this.salary = salary;
}

Employee.prototype = Object.create(Person.prototype); // 将 Employee 的原型对象设置为 Person 的原型对象
Employee.prototype.getSalary = function() {
  return this.salary;
};

const person = new Person("John", 30);
const employee = new Employee(5000);

console.log(person.getInfo()); // 输出:姓名:John,年龄:30
console.log(employee.getInfo()); // 输出:姓名:John,年龄:30
console.log(employee.getSalary()); // 输出:5000

在这个示例中,我们创建了两个类:PersonEmployeeEmployee 类继承自 Person 类,通过调用 Person 类的构造函数来初始化 Employee 对象的属性。

每个类都有一个原型对象,它是一个用于共享属性和方法的模板。在这个例子中,Person.prototypeEmployee.prototype 分别是 Person 类和 Employee 类的原型对象。

当我们创建 personemployee 对象时,它们会自动继承其类的原型对象的属性和方法。因此,person 对象可以访问 Person.prototype 上的 getInfo 方法,而 employee 对象可以访问 Person.prototype 上的 getInfo 方法以及 Employee.prototype 上的 getSalary 方法。

当我们访问 person.getInfo()employee.getInfo() 时,JavaScript 会沿着原型链向上查找,直到找到定义了该方法的原型对象。在这个例子中,Person.prototype.getInfo() 方法被找到并执行,因此输出结果为 姓名:John,年龄:30

当我们访问 employee.getSalary() 时,同样的过程会发生,但是这次 JavaScript 会在 Employee.prototype 上找到定义了该方法的原型对象,并执行 Employee.prototype.getSalary() 方法,因此输出结果为 5000

通过原型链,我们可以实现继承、共享属性和方法、动态扩展对象等功能。理解原型链对于深入理解 JavaScript 的面向对象编程特性和开发高效的 JavaScript 代码非常重要。

四、原型链的应用

  • 实现继承
  • 共享属性和方法

在这里插入图片描述

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

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

相关文章

[UnityWebGL]修改webgl启动模板

首先了解什么是WEBGGL启动模板,如下图: 其次,启动模板在哪里设置,如下图: 最后,怎么改启动模板里面的内容(提供最简单的方式,直接改官方的): 1、首先在Asset…

Spring Cloud Gateway与spring-cloud-circuitbreaker集成与理解

官方文档 spring-cloud-gateway文档地址: https://spring.io/projects/spring-cloud-gateway#overview spring-cloud-circuitbreaker文档地址: https://spring.io/projects/spring-cloud-circuitbreaker 两者关系 首先spring-cloud-gateway集成了断路…

[c++]——string类____详细初步了解string类的运用

在成为大人的路上喘口气. 目录 🎓标准库类型string 🎓定义和初始化string对象 💻string类对象的常见构造 💻string类对象的不常见构造 💻读写string对象 🎓 string类对象的修改操作 &#x1f4…

Opencv制作电子签名(涉及知识点:像素过滤,图片通用resize函数,像素大于某个阈值则赋值为其它的像素值)

import cv2def resize_by_ratio(image, widthNone, heightNone, intercv2.INTER_AREA):img_new_size None(h, w) image.shape[:2] # 获得高度和宽度if width is None and height is None: # 如果输入的宽度和高度都为空return image # 直接返回原图if width is None:h_ratio …

git-6

1.如何用project管理issue? 用project看板管理issue 有五种类型:None、Basic kanban、Automated kanban、Automated kanban with reviews、Bug triage 首先选用Bug triage 利用看板就会很直观,很便捷,Issues也支持,有…

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

思维模型 莫扎特效应

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。音乐激发无限潜能。 1 莫扎特效应的应用 1.1 莫扎特效应在教育领域的应用-Baby Einstein”公司 在美国,有一家名为“Baby Einstein”的公司,该公司生产和销售专门为…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下: 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

前端小记--2.element-ui中级联选择器cascader如何默认展开下拉框

最近做项目时,遇到一个需求:在一个排班表中,展示人员的值班情况,点击单元格,弹出下拉框,修改人员排班信息。 由于下拉框选择内容是树状结构,这里使用了element-ui中级联组件cascader&#xff0c…

一起学docker系列之十七Docker Compose 与手动操作的比较与优势分析

目录 1 前言2 不使用 Docker Compose2.1 启动 MySQL 容器2.2 启动 Redis 容器2.3 启动微服务容器 3 使用 Docker Compose4 使用 Docker Compose 的优势5 结语参考地址 1 前言 在当今容器化应用的开发与部署中,容器编排工具的选择对于简化流程、提高效率至关重要。本…

6-69.鸭子也是鸟

按要求完成下面的程序: 1、定义一个Bird类,包含一个void类型的无参的speak方法,输出“Jiu-Jiu-Jiu”。 2、定义一个Duck类,公有继承自Bird类,其成员包括: (1)私有string类型的成员na…

WPF实现文字纵向排布的TabItem

文章目录 基本用法文字竖排显示 WPF布局 基本用法 WPF中的TabControl是一个容器控件,用于在单个窗体或页面中承载多个选项卡。每个选项卡可以包含不同的控件,用于显示不同的内容,其最简单的调用方法如下,只需在TabControl中无脑…

德迅云安全的日常网站安全性措施、以及更多网站安全工具的推荐与使用。

要确保网站的安全性,可以采取以下措施: 更新和维护:定期更新网站的操作系统、应用程序和插件,确保使用的是最新版本,以修复已知的安全漏洞。 强密码策略:使用强密码,包含字母、数字和特殊字符的…

合成相机模型【图形学】

相机在计算机图形学中有两个方面的考虑:相机的位置和相机的形状。 要了解后者,我们需要了解相机的工作原理。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - R…

BearPi Std 板从入门到放弃 - 1 引气入体篇

安装相关开发工具 Keil MDK 工具下载 略, 自行体会 Keil 芯片支持包下载 Keil 包 网址 https://www.keil.com/pack 此处下载的是STM32L4xx的支持包 https://www.keil.com/pack/Keil.STM32L4xx_DFP.2.6.2.pack STM32CubeMX 下载与包下载 i. 下载(需要使用用户&…

爬虫学习(三)用beautiful 解析html

安装库 import requests from bs4 import BeautifulSoup headers {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0"} for start_num in range(0,250…

【Gstreamer】自定义Plugin及调用Plugin

Gstreamer自定义Plugin及调用自定义Plugin Gstreamer支持开发者自己创建Plugin,创建后的Plugin可以通过工具gst-inspect-1.0查看,并在代码中调用自定义的plugin。 Gstreamer 官网中给出了Plugin创建教程,但实际上如果按照教程一步步走&…

机器学习笔记 - 异常检测之OneClass SVM算法简述

一、异常检测是什么? 如下图,理想中我们可以找到一个框住大部分正常样本的决策边界,而在边界外部的数据点(蓝点)即视为异常。 但实际情况下数据都没有标签,因此很难定义正常还是不正常。异常检测的主要挑战如下:正常与异常行为之间的界限往往并不明确、不同的应…

org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource

DynamicDataSource-CSDN博客 /** Copyright 2002-2020 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the L…

uni-app 微信小程序之自定义中间圆形tabbar

文章目录 1. 自定义tabbar效果2. pages新建tabbar页面3. tabbar 页面结构4. tabbar 页面完整代码 1. 自定义tabbar效果 2. pages新建tabbar页面 首先在 pages.json 文件中,新建一个 tabbar 页面 "pages": [ //pages数组中第一项表示应用启动页&#xff…