当前位置: 首页 > news >正文

深入理解 JavaScript 对象原型,解密原型链之谜(上)

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 摘要
  • 引言
  • 一、对象原型的基础📘
    • 解释对象原型的概念和作用
    • 展示如何创建和使用对象原型
  • 二、原型链的工作原理📚
    • 介绍原型链的基本概念
    • 通过示例解释原型链的继承机制

摘要

本文将深入探讨 JavaScript 中的对象原型,包括其工作原理、用途和优势。通过实例演示,帮助读者更好地掌握这一重要概念。🎓

引言

大家好,我是阿珊!对象原型是 JavaScript 中一个非常重要的特性,它对于理解和扩展对象的行为起着关键作用。在本文中,我们将一起探索对象原型的奥秘。让我们开启这段有趣的学习之旅吧!💡

一、对象原型的基础📘

解释对象原型的概念和作用

在 JavaScript 中,对象原型(Object Prototype)是对象继承属性和方法的一种机制。每个 JavaScript 对象都有一个原型,当我们试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。

对象原型的概念和作用如下:

  1. 对象原型的概念:对象原型是一个包含共享属性和方法的对象。在 JavaScript 中,所有的对象都是通过原型链来访问属性和方法的。当我们创建一个对象时,它会从它的原型继承属性和方法。

  2. 对象原型的作用:对象原型使得我们可以共享属性和方法,从而减少内存占用和提高性能。当我们创建一个对象时,如果该对象需要使用一些通用的属性和方法,我们可以在原型上定义这些属性和方法,从而使得所有对象都可以共享这些属性和方法。

例如,在 JavaScript 中,所有的数组对象都有一个原型,这个原型包含了数组对象通用的属性和方法。当我们创建一个数组对象时,它会从数组原型上继承这些属性和方法。

const arr = [1, 2, 3];
console.log(arr.__proto__ === Array.prototype); // 输出:true

在上面的示例中,arr 是一个数组对象,它从 Array.prototype(数组原型)上继承了属性和方法。

总之,对象原型是 JavaScript 中对象继承属性和方法的一种机制,它使得我们可以共享通用的属性和方法,从而减少内存占用和提高性能。

展示如何创建和使用对象原型

在 JavaScript 中,可以通过以下方式创建和使用对象原型:

  1. 创建对象原型:可以使用 Object.create() 方法来创建一个对象原型。这个方法会创建一个新对象,该对象具有指定的原型。
const prototype = Object.create(Object.prototype);

在上面的示例中,我们创建了一个新对象 prototype,它的原型是 Object.prototype

  1. 为对象原型添加属性和方法:可以为对象原型添加属性和方法,从而使得所有对象都可以共享这些属性和方法。
prototype.greeting = "Hello";
prototype.sayHello = function() {console.log(`${this.greeting}, world!`);
};

在上面的示例中,我们为 prototype 添加了 greetingsayHello 属性和方法。

  1. 创建对象并继承原型:可以使用 Object.create() 方法创建一个新对象,并指定一个原型。这样,新对象就会从指定的原型上继承属性和方法。
const person = Object.create(prototype);
person.name = "Alice";

在上面的示例中,我们创建了一个新对象 person,并指定它的原型为 prototype。因此,person 会从 prototype 上继承 greetingsayHello 属性和方法。

  1. 使用原型链访问属性和方法:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。
console.log(person.greeting); // 输出:"Hello"
person.sayHello(); // 输出:"Hello, world!"

在上面的示例中,我们访问了 person 对象的 greetingsayHello 属性和方法,这些属性和方法是从 prototype 上继承的。

总之,在 JavaScript 中,可以通过创建对象原型、为原型添加属性和方法、创建对象并继承原型以及使用原型链访问属性和方法等方式来使用对象原型。

二、原型链的工作原理📚

介绍原型链的基本概念

原型链是 JavaScript 中对象继承属性和方法的一种机制。当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。这种查找过程形成了一条原型链。

原型链的基本概念如下:

  1. 每个 JavaScript 对象都有一个原型:在 JavaScript 中,所有的对象都是通过原型链来访问属性和方法的。当我们创建一个对象时,它会从它的原型继承属性和方法。

  2. 原型也是一个对象:在 JavaScript 中,原型也是一个对象,它包含共享属性和方法。当我们创建一个对象时,它会从原型上继承属性和方法。

  3. 原型链:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。这种查找过程形成了一条原型链。

  4. 查找过程:在查找原型链时,JavaScript 会从当前对象开始,逐个检查其原型,直到找到指定的属性和方法,或者到达原型链的末尾(Object.prototype)。

  5. 原型链中断:如果到达原型链的末尾仍然没有找到指定的属性和方法,那么查找过程将会中断,并抛出一个 ReferenceError 错误。

下面是一个简单的示例,展示了原型链的基本概念:

const prototype = {greeting: "Hello",sayHello: function() {console.log(`${this.greeting}, world!`);}
};const person = Object.create(prototype);
person.name = "Alice";console.log(person.greeting); // 输出:"Hello"
person.sayHello(); // 输出:"Hello, world!"

在上面的示例中,我们创建了一个原型对象 prototype,并创建了一个新对象 person,并指定它的原型为 prototype。因此,person 会从 prototype 上继承 greetingsayHello 属性和方法。当我们访问 person 对象的 greetingsayHello 属性和方法时,JavaScript 会沿着原型链查找这些属性和方法,并找到它们。

总之,原型链是 JavaScript 中对象继承属性和方法的一种机制,它使得我们可以共享通用的属性和方法,从而减少内存占用和提高性能。

通过示例解释原型链的继承机制

在 JavaScript 中,对象继承属性和方法的一种方式是通过原型链。原型链继承机制允许我们在一个对象上添加或修改属性,然后在其派生对象中继承这些属性。以下是一个简单的示例,解释了原型链的继承机制:

function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};function Employee(name, employeeId) {Person.call(this, name);this.employeeId = employeeId;
}Employee.prototype = Object.create(Person.prototype);Employee.prototype.constructor = Employee;Employee.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name} and my employee ID is ${this.employeeId}`);
};var employee = new Employee("Alice", "E123");
employee.sayHello(); // 输出:Hello, my name is Alice and my employee ID is E123

在这个示例中,我们首先创建了一个 Person 构造函数和一个 Employee 构造函数。Employee 继承了 Person。为了实现继承,我们使用 Object.create(Person.prototype) 创建了一个新的原型对象,这个新原型对象继承了 Person 的原型。然后我们将 Employee 的原型指向这个新创建的原型对象。这样,Employee 就继承了 Person 的属性和方法。

我们还重写了 EmployeesayHello 方法,使其输出更具体的信息。当我们创建一个 Employee 实例并调用 sayHello 方法时,由于继承了 PersonsayHello 方法,所以可以正常调用并输出结果。

总之,在 JavaScript 中,可以通过原型链继承机制在一个对象上添加或修改属性,然后在其派生对象中继承这些属性。

相关文章:

深入理解 JavaScript 对象原型,解密原型链之谜(上)

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

产品经理学习-产品运营《什么是SOP》

目录 什么是SOP 如何执行SOP 执行SOP的重点 什么是SOP SOP就是项目流程操作的说明书 日常工作中的例行操作: 例行操作是指,在每一天,针对每一个用户,在每个项目之中,都必须完成的操作,这些必须完成的操…...

大数据Hadoop生态圈

存储: HDFS(namenode,datanode) 计算:MapReduce(mapreduce,基于磁盘) 便于用sql操作:Hive(核心 metastore,存储这些结构化的数据),同类的还有Impala,hbase等 基于yaml的资源调度 hive &…...

算法简介:查找与算法运行时间

文章目录 1. 二分查找与简单查找1.1 运行时间 2. 旅行商问题 算法是一组完成任务的指令。任何代码片段都可以视为算法。 1. 二分查找与简单查找 二分查找是一种算法,其输入是一个有序的元素列表,如果要查找的元素包含在列表中,二分查找返回…...

零基础C++开发上位机--基于QT5.15的串口助手(三)

本系列教程本着实践的目的,争取每一节课都带大家做一个小项目,让大家多实践多试验,这样才能知道自己学会与否。 接下来我们这节课,主要学习一下QT的串口编程。做一款自己的串口助手,那么这里默认大家都是具备串口通信…...

Facebook的虚拟社交愿景:元宇宙时代的新起点

在当今数字化时代,社交媒体已经成为人们生活中不可或缺的一部分。而随着科技的不断进步和社会的发展,元宇宙已经成为了人们关注的热点话题之一。作为社交媒体的领军企业之一,Facebook也在积极探索虚拟社交的未来,将其视为元宇宙时…...

【深度学习笔记】4_6 模型的GPU计算

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 4.6 GPU计算 到目前为止,我们一直在使用CPU计算。对复杂的神经网络和大规模的数据来说,使用CPU来计算可能不够…...

留学申请过程中如何合理使用AI?大学招生官怎么看?

我们采访过的学生表示,他们在写essay的过程中会使用 ChatGPT,主要用于以下两个方面:第一,生成想法和头脑风暴;第二,拼写和语法检查。 纽约时报的娜塔莎辛格(Natasha Singer)在一篇文…...

vue2与vue3的diff算法有什么区别

在 Vue 中,虚拟 DOM 是一种重要的概念,它通过将真实的 DOM 操作转化为对虚拟 DOM 的操作,从而提高应用的性能。Vue 框架在虚拟 DOM 的更新过程中采用了 Diff 算法,用于比较新旧虚拟节点树,找出需要更新的部分&#xff…...

ES小总结

组合查询 FunctionScoreQueryBuilder functionScoreQuery QueryBuilders.functionScoreQuery(boolQuery,new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{new FunctionScoreQueryBuilder.FilterFunctionBuilder(QueryBuilders.termQuery("isAD",true),Score…...

vue2与vue3中父子组件传参的区别

本次主要针对vue中父子组件传参所进行讲解 一、vue2和vue3父传子区别 1.vue2的父传子 1).在父组件子标签中自定义一个属性 <sonPage :子组件接收到的类名"传输的数据">子组件</sonPage> 2).在子组件中peops属性中拿到自定属性 props: {子组件接收的…...

使用vuetify实现全局v-alert消息通知

前排提示&#xff0c;本文为引流文&#xff0c;文章内容不全&#xff0c;更多信息前往&#xff1a;oldmoon.top 查看 简介 使用强大的Vuetify开发前端页面&#xff0c;结果发现官方没有提供简便的全局消息通知组件&#xff08;像Element中的ElMessage那样&#xff09;&#xf…...

CentOS 7.9上编译wireshark 3.6

工作环境是Centos 7.9&#xff0c;原本是通过flathub安装的wireshark&#xff0c;但是在gnome的application installer上升级到wireshark 4.2.3之后就运行不起来了&#xff0c;flatpak run org.wireshark.Wireshark启动提示缺少qt6&#xff0c;查了一下wireshark新版是依赖qt6的…...

初学学习408之数据结构--数据结构基本概念

初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容&#xff0c;作为初学者的我会尽力详细直白地介绍数据结构的…...

Java项目中必须使用本地缓存的几种情况

Java项目中必须使用本地缓存的几种情况 在Java项目的开发过程中&#xff0c;为了提高应用的性能和响应速度&#xff0c;缓存机制经常被使用。其中&#xff0c;本地缓存作为一种常见的缓存方式&#xff0c;将数据存储在应用程序的本地内存或磁盘中&#xff0c;以便快速访问。下…...

【鸿蒙 HarmonyOS 4.0】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…...

Android java基础_异常

一.异常的概念 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能出现的不正常情况或错误。它是一个事件&#xff0c;它会干扰程序的正常执行流程&#xff0c;并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的&#xff0c;…...

高数考研 -- 公式总结(更新中)

1. 两个重要极限 (1) lim ⁡ x → 0 sin ⁡ x x 1 \lim _{x \rightarrow 0} \frac{\sin x}{x}1 limx→0​xsinx​1, 推广形式 lim ⁡ f ( x ) → 0 sin ⁡ f ( x ) f ( x ) 1 \lim _{f(x) \rightarrow 0} \frac{\sin f(x)}{f(x)}1 limf(x)→0​f(x)sinf(x)​1. (2) lim ⁡…...

详解顺序结构滑动窗口处理算法

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…...

Java 8中使用Stream来操作集合

Java 8中使用Stream来操作集合 在Java 8中&#xff0c;你可以使用Stream API来操作集合&#xff0c;这使得集合的处理变得更加简洁和函数式。Stream API提供了一系列的中间操作&#xff08;intermediate operations&#xff09;和终端操作&#xff08;terminal operations&…...

MATLAB环境下一种改进的瞬时频率(IF)估计方法

相对于频率成分单一、周期性强的平稳信号来说&#xff0c;具有非平稳、非周期、非可积特性的非平稳信号更普遍地存在于自然界中。调频信号作为非平稳信号的一种&#xff0c;由于其频率时变、距离分辨率高、截获率低等特性&#xff0c;被广泛应用于雷达、地震勘测等领域。调频信…...

解决:selenium web browser 的版本适配问题

文章目录 解决方案&#xff1a;使用 webdriver manager 自动适配驱动 使用 selenium 操控浏览器的时候报错&#xff1a; The chromedriver version (114.0.5735.90) detected in PATH at /opt/homebrew/bin/chromedriver might not be compatible with the detected chrome ve…...

pytest.param作为pytest.mark.parametrize的参数进行调用

pytest.param&#xff1a;在 pytest.mark.parametrize 中可以作为一个指定的参数进行调用 获取数据库&#xff08;网页端&#xff09;数据&#xff0c;通过pytest.param包装成数据包用于pytest.mark.parametrize 中实现数据驱动调用。 import os import pytest import json fr…...

如何判断一个元素是否在可视区域中?

文章目录 一、用途二、实现方式offsetTop、scrollTopgetBoundingClientRectIntersection Observer创建观察者传入被观察者 三、案例分析参考文献 一、用途 可视区域即我们浏览网页的设备肉眼可见的区域&#xff0c;如下图 在日常开发中&#xff0c;我们经常需要判断目标元素是…...

Go Run - Go 语言中的简洁指令

原文&#xff1a;breadchris - 2024.02.21 也许听起来有些傻&#xff0c;但go run是我最喜欢的 Go 语言特性。想要运行你的代码&#xff1f;只需go run main.go。它是如此简单&#xff0c;我可以告诉母亲这个命令&#xff0c;她会立即理解。就像 Go 语言的大部分功能一样&…...

Spring全面精简总结

Spring两大核心功能&#xff1a;IOC控制反转、AOP面向切面的编程 控制反转(loC&#xff0c;Inversion of Control)&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器&#xff0c;通过容器来实现对象的装配和管理。控制反转就是…...

低代码开发如何助力数字化企业管理系统平台构建

随着数字化时代的到来&#xff0c;企业对于管理系统的需求日益增长。高效的管理系统可以提高企业的运作效率&#xff0c;降低成本&#xff0c;提升竞争力。然而&#xff0c;传统的开发方式在应对日益复杂的管理系统需求时&#xff0c;显得力不从心。低代码开发作为一种新兴的开…...

ElasticSearch之零碎知识点

写在前面 本文记录es的零碎知识点&#xff0c;包括但不限于概念&#xff0c;集群方式&#xff0c;等。 1&#xff1a;词项查询 VS 全文查询 词项查询&#xff1a;查询的内容不做分词处理&#xff0c;输入的什么查询什么。 全文查询&#xff1a;查询的内容会做分词处理&…...

【春运抢票攻略浅析】

参考 最全12306放票规则&#xff0c;抢票策略&#xff0c;候补作用2023年12306抢票攻略&#xff08;纯技巧&#xff09; 研究放票规则&#xff0c;候补的时候车次进行一下挑选&#xff0c;能够买长乘短的尽量买长&#xff0c;不要候补一些区间票吧&#xff0c;这是一开始放票…...

【Java EE初阶二十五】简单的表白墙(一)

1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…...

linux建设视频网站/开封网站推广

Java内存溢出详解 一、常见的Java内存溢出有以下三种&#xff1a; 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap&#xff08;堆&#xff09;溢出JVM在启动的时候会自动设置JVM Heap的值&#xff0c;其初始空间(即-Xms)是物理内存的1/64&#xff0c;最大空间(-…...

变态版手游/龙岩seo

最近因为脚本用到python的文件复制操作&#xff0c;而且又涉及网络目录&#xff0c;网上比较缺少这块的知识的实例&#xff0c;特此贡献也为自己更好的学习。 对文件的复制操作一般要引入shutil模块&#xff1a; import shutil shutil.copyfile("old","new&qu…...

搭建网站挣钱/网易疫情实时最新数据

负责控制信号的输入和输出叫做使能&#xff0c;是一个动词&#xff0c;英文‘Enable’。英文Enable&#xff0c;前缀en-就是使的意思&#xff0c;able就是能够。合起来就是使能。使能通俗点说就是一个“允许”信号&#xff0c;进给使能也就是允许进给的信号&#xff0c;也就是说…...

手机建设银行网站进不去/免费发布产品信息的网站

Java语言基本语法 一、标识符和关键字 标识符 在java语言中&#xff0c;用来标志类名、对象名、变量名、方法名、类型名、数组名、包名的有效字符序列&#xff0c;称为“标识符”&#xff1b;标识符由字母、数字、下划线、美元符号组成&#xff0c;且第一个字符不能是数字&…...

做网站需要租服务器/技能培训有哪些

以前做过一个自动收集网页内容的工具&#xff0c;使用的还可以&#xff0c;用Indy的IdHttp组件来获取网页内容然后分析处理。 现在很多网站都采用了Ajax技术&#xff0c;网页内容异步刷新&#xff0c;所以使用IdHttp组件就无法获取完整的网页内容了。我在 http://www.cnblogs.c…...

做网站的前景如何/无锡网站制作无锡做网站

1 目的 给python应用一个独立的运行环境&#xff0c;独立于其它的python应用也独立于系统的python环境。 环境升级不影响其它应用。 避免包冲突。 2 创建方式 2.1 pycharm中创建 project interpreter处点击配置按钮---new environment---然后选择一个location和选择interpreter…...