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

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》
文章目录
- 摘要
- 引言
- 一、对象原型的基础📘
- 解释对象原型的概念和作用
- 展示如何创建和使用对象原型
 
- 二、原型链的工作原理📚
- 介绍原型链的基本概念
- 通过示例解释原型链的继承机制
 
摘要
本文将深入探讨 JavaScript 中的对象原型,包括其工作原理、用途和优势。通过实例演示,帮助读者更好地掌握这一重要概念。🎓
引言
大家好,我是阿珊!对象原型是 JavaScript 中一个非常重要的特性,它对于理解和扩展对象的行为起着关键作用。在本文中,我们将一起探索对象原型的奥秘。让我们开启这段有趣的学习之旅吧!💡
一、对象原型的基础📘
解释对象原型的概念和作用
在 JavaScript 中,对象原型(Object Prototype)是对象继承属性和方法的一种机制。每个 JavaScript 对象都有一个原型,当我们试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。
对象原型的概念和作用如下:
-  对象原型的概念:对象原型是一个包含共享属性和方法的对象。在 JavaScript 中,所有的对象都是通过原型链来访问属性和方法的。当我们创建一个对象时,它会从它的原型继承属性和方法。 
-  对象原型的作用:对象原型使得我们可以共享属性和方法,从而减少内存占用和提高性能。当我们创建一个对象时,如果该对象需要使用一些通用的属性和方法,我们可以在原型上定义这些属性和方法,从而使得所有对象都可以共享这些属性和方法。 
例如,在 JavaScript 中,所有的数组对象都有一个原型,这个原型包含了数组对象通用的属性和方法。当我们创建一个数组对象时,它会从数组原型上继承这些属性和方法。
const arr = [1, 2, 3];
console.log(arr.__proto__ === Array.prototype); // 输出:true
在上面的示例中,arr 是一个数组对象,它从 Array.prototype(数组原型)上继承了属性和方法。
总之,对象原型是 JavaScript 中对象继承属性和方法的一种机制,它使得我们可以共享通用的属性和方法,从而减少内存占用和提高性能。
展示如何创建和使用对象原型
在 JavaScript 中,可以通过以下方式创建和使用对象原型:
- 创建对象原型:可以使用 Object.create()方法来创建一个对象原型。这个方法会创建一个新对象,该对象具有指定的原型。
const prototype = Object.create(Object.prototype);
在上面的示例中,我们创建了一个新对象 prototype,它的原型是 Object.prototype。
- 为对象原型添加属性和方法:可以为对象原型添加属性和方法,从而使得所有对象都可以共享这些属性和方法。
prototype.greeting = "Hello";
prototype.sayHello = function() {console.log(`${this.greeting}, world!`);
};
在上面的示例中,我们为 prototype 添加了 greeting 和 sayHello 属性和方法。
- 创建对象并继承原型:可以使用 Object.create()方法创建一个新对象,并指定一个原型。这样,新对象就会从指定的原型上继承属性和方法。
const person = Object.create(prototype);
person.name = "Alice";
在上面的示例中,我们创建了一个新对象 person,并指定它的原型为 prototype。因此,person 会从 prototype 上继承 greeting 和 sayHello 属性和方法。
- 使用原型链访问属性和方法:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。
console.log(person.greeting); // 输出:"Hello"
person.sayHello(); // 输出:"Hello, world!"
在上面的示例中,我们访问了 person 对象的 greeting 和 sayHello 属性和方法,这些属性和方法是从 prototype 上继承的。
总之,在 JavaScript 中,可以通过创建对象原型、为原型添加属性和方法、创建对象并继承原型以及使用原型链访问属性和方法等方式来使用对象原型。
二、原型链的工作原理📚
介绍原型链的基本概念
原型链是 JavaScript 中对象继承属性和方法的一种机制。当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。这种查找过程形成了一条原型链。
原型链的基本概念如下:
-  每个 JavaScript 对象都有一个原型:在 JavaScript 中,所有的对象都是通过原型链来访问属性和方法的。当我们创建一个对象时,它会从它的原型继承属性和方法。 
-  原型也是一个对象:在 JavaScript 中,原型也是一个对象,它包含共享属性和方法。当我们创建一个对象时,它会从原型上继承属性和方法。 
-  原型链:当访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 会在该对象的原型上查找。这种查找过程形成了一条原型链。 
-  查找过程:在查找原型链时,JavaScript 会从当前对象开始,逐个检查其原型,直到找到指定的属性和方法,或者到达原型链的末尾( Object.prototype)。
-  原型链中断:如果到达原型链的末尾仍然没有找到指定的属性和方法,那么查找过程将会中断,并抛出一个 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 上继承 greeting 和 sayHello 属性和方法。当我们访问 person 对象的 greeting 和 sayHello 属性和方法时,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 的属性和方法。
我们还重写了 Employee 的 sayHello 方法,使其输出更具体的信息。当我们创建一个 Employee 实例并调用 sayHello 方法时,由于继承了 Person 的 sayHello 方法,所以可以正常调用并输出结果。
总之,在 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 算法,用于比较新旧虚拟节点树,找出需要更新的部分ÿ…...
 
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消息通知
前排提示,本文为引流文,文章内容不全,更多信息前往:oldmoon.top 查看 简介 使用强大的Vuetify开发前端页面,结果发现官方没有提供简便的全局消息通知组件(像Element中的ElMessage那样)…...
CentOS 7.9上编译wireshark 3.6
工作环境是Centos 7.9,原本是通过flathub安装的wireshark,但是在gnome的application installer上升级到wireshark 4.2.3之后就运行不起来了,flatpak run org.wireshark.Wireshark启动提示缺少qt6,查了一下wireshark新版是依赖qt6的…...
 
初学学习408之数据结构--数据结构基本概念
初学学习408之数据结构我们先来了解一下数据结构的基本概念。 数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。 本内容来源于参考书籍《大话数据结构》与《王道数据结构》。除去书籍中的内容,作为初学者的我会尽力详细直白地介绍数据结构的…...
Java项目中必须使用本地缓存的几种情况
Java项目中必须使用本地缓存的几种情况 在Java项目的开发过程中,为了提高应用的性能和响应速度,缓存机制经常被使用。其中,本地缓存作为一种常见的缓存方式,将数据存储在应用程序的本地内存或磁盘中,以便快速访问。下…...
 
【鸿蒙 HarmonyOS 4.0】TypeScript开发语言
一、背景 HarmonyOS 应用的主要开发语言是 ArkTS,它由 TypeScript(简称TS)扩展而来,在继承TypeScript语法的基础上进行了一系列优化,使开发者能够以更简洁、更自然的方式开发应用。值得注意的是,TypeScrip…...
 
Android java基础_异常
一.异常的概念 在Java中,异常(Exception)是指程序执行过程中可能出现的不正常情况或错误。它是一个事件,它会干扰程序的正常执行流程,并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的,…...
 
高数考研 -- 公式总结(更新中)
1. 两个重要极限 (1) lim  x → 0 sin  x x 1 \lim _{x \rightarrow 0} \frac{\sin x}{x}1 limx→0xsinx1, 推广形式 lim  f ( x ) → 0 sin  f ( x ) f ( x ) 1 \lim _{f(x) \rightarrow 0} \frac{\sin f(x)}{f(x)}1 limf(x)→0f(x)sinf(x)1. (2) lim …...
 
详解顺序结构滑动窗口处理算法
🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…...
Java 8中使用Stream来操作集合
Java 8中使用Stream来操作集合 在Java 8中,你可以使用Stream API来操作集合,这使得集合的处理变得更加简洁和函数式。Stream API提供了一系列的中间操作(intermediate operations)和终端操作(terminal operations&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
 
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
