面试题:谈谈你对 JS 原型链的理解

面试题:谈谈你对 JS 原型链的理解

JavaScript 是一种基于原型的语言,即每个对象都拥有一个原型对象,对象通过其原型对象继承方法和属性。原型对象也有其原型对象,依次类推,就构成了原型链。当对象访问一个属性或方法后,首先需要在其本身上查找,查找不到才去其原型对象中查找,查找不到再去其原型对象的原型对象中查找,···,一直到顶层原型,即 Object 的原型对象身上去,Object 的原型对象的原型对象则为 null。这就是原型链实现继承的原理。

原型对象分为显式原型对象隐式原型对象函数的原型对象是显式原型对象,通过 .prototype 的方式可以访问到其原型对象。实例对象的原型对象是隐式原型对象,通过 [[Prototype]].__proto__ 的方式可以访问到其原型对象。

这里的函数指的是构造函数class 语法的类名也可以作为这里的函数看待;这里的实例对象是由对应的函数通过 new 关键字创建的,其原型对象是一个私有属性__proto__ 实际上是一个非标准的访问实例对象的原型对象的方式。

原型对象之间的重要关系

  • 实例对象的原型指向其构造函数的原型

    f.__proto__ === Foo.prototype
    F.__proto__ === Function.prototype // 每个函数可以看作是 Function 函数的一个实例(区分)
    o.__proto__ === Object.prototype
    
  • 构造函数的原型指向其继承的构造函数的原型

    f.__proto__.__proto__ === Foo.prototype.__proto__ === Object.prototype
    F.__prpto__.__proto__ === Function.prototype.__proto__ === Object.prototype
    o.__proto__.__proto__ === Object.prototype.__proto__ === null
    
  • 构造函数的原型和自身形成循环引用

    Foo.prototype.constructor === Foo
    Function.prototype.constructor === Function
    Object.prototype.constructor === Object
    
  • Function 和 Object 之间形成循环引用

    Function.prototype.__proto__ === Object.prototype
    Object.__proto__ === Function.prototype
    
  • A t t e n t i o n \Large{\bf{Attention}} Attention:如果将构造函数看作实例对象,其隐式原型对象为 Function.prototype。因此可以认为:所有构造函数都是由 Function 创建的实例对象

img

获取原型对象的方式

  • 获取显示原型对象(函数的原型):function_name.prototype
  • 获取隐式原型对象(实例对象的原型):Object.getPrototypeOf(obj_name)

原型链检查

  • 检查构造函数的显式原型是否出现在某个实例对象的原型链上,即该实例对象是否可以通过原型对象,访问到该构造函数的显式原型obj_name instanceof function_name

    Object instanceof Object
    Function instanceof Function
    Object instanceof Function // 所有函数的隐式原型都指向 Function
    Function instanceof Object // 所有函数的显式原型最终都指向 Object
    

创建对象的几种方式

  • 字面量创建

    let o = {a: 1}; // o ---> Object.prototype ---> null
    var a = [1, 2, 3]; // a ---> Array.prototype ---> Object.prototype ---> null
    function f(){ // f ---> Function.prototype ---> Object.prototype ---> nullreturn 2;
    }
    
  • new 构造函数

let o = new Object();
/* 使用 new 关键字后 JS 做了什么? */
// 1. 创建一个空的简单 JS 对象 {}
// 2. 为 Step1 创建的对象添加 __proto__ 属性,并将该属性链接到构造函数的原型对象上
// 3. 指定 Step 创建的对象作为 this 上下文
// 4. 返回 this(如果构造函数中没有指定返回值的话)
  • Object.create(obj_name) 创建一个对象,同时指定其原型对象为 obj_name

    var a = {a: 1}; // a ---> Object.prototype ---> null
    var b = Object.create(a); // b ---> a ---> Object.prototype ---> null
    var c = Object.create(b); // c ---> b ---> a ---> Object.prototype ---> null
    var d = Object.create(null); // d ---> null。
    
  • class 关键字创建类,然后通过 new 创建对象

原型的好处和坏处

  • 优点
    • JS 对象可以通过原型链继承其他对象的属性和方法,实现代码复用
    • JS 的原型链是动态变化的,可以在运行时修改对象的原型,此时所有继承该原型的对象都可以访问到这些改变。比如在构造函数的原型上添加新的方法,则此时所有实力对象都可以立即访问到增加的新方法。
    • 原型链机制允许实例对象共享方法和属性,因此可以优化性能。所有实例对象都可以共享其构造函数原型上的方法,从而有利于减少内存占用
  • 缺点
    • JS 原型链上的查找效率比较低下,从而可能会影响性能。当试图访问不存在的属性时,JS 会遍历整个原型链,比较耗时。
    • 一旦修改了原型上的属性或方法,那么所有继承该原型的对象都会受到影响
    • 如果对象本身存在与原型链中同名的属性,此时对象自身的属性会遮蔽原型链上的同名属性

怎么把属性和方法放在原型或实例对象上

语法function 语法class 语法
将属性放在实例对象身上image-20240604145524948image-20240604145700025
将方法放在实例对象身上image-20240604145546457image-20240604145716127
将属性放在原型对象身上image-20240604145630476image-20240604145803466
将方法放在原型对象身上image-20240604145616652image-20240604145750198

REFERENCES

https://juejin.cn/post/7139441807338766343

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

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

相关文章

BioTech - 计算大量 蛋白质结构预测结果 的聚类中心(Cluster)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/139419653 CASP16 的 H0215 样本,聚类之后,10个类别的最高置信度结果。 Agglomerative Clustering,即凝聚层次聚类,属于层次聚类算法,通过逐步合并或聚集数据点,…

Qt-demo高级感无边框窗口、美化基础控件

展示: 代码实现: // 鼠标按下事件(记录拉伸窗口或移动窗口时的起始坐标(左上角)) void framelessWidget::mousePressEvent(QMouseEvent *event) {if(event->button() Qt::LeftButton){mousePressed true; #if (QT_VERSION &…

傅立叶变换矩阵的频谱响应

傅立叶变换矩阵的频谱响应 线性变换可以用矩阵表示,傅立叶变换是一种线性变换,因此也可以使用矩阵表示。具体可以参考:离散傅立叶变换和线性变换的关系:什么是线性空间? 1、傅立叶矩阵 X [ k ] ∑ n 0 N − 1 x [ …

【EI会议/稳定检索】2024年电机与电气控制国际会议(ICMEC 2024)

2024 International Conference on Motor and Electrical Control 2024年电机与电气控制国际会议 【会议信息】 会议简称:ICMEC 2024 截稿时间:(以官网为准) 大会地点:中国厦门 会议官网:www.meciac.com 会议邮箱&…

每日十题---三

1. Vue中$nextTick原理 1. 简单的理解就是它就是一个setTimeout函数,将函数放到异步后去处理。 2. Vue 在更新 DOM 时是异步执行的。只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更。如果同一个 watcher 被…

海外仓代发系统选择标准:功能稳定和性价比高一个都不能少

对海外仓来说,一件代发基本都是比较核心的业务。不过这个核心业务现在的竞争确实也比较大,对海外仓企业而言,想在一件代发上做到让客户满意,还是需要多方面努力的。 一方面,需要自己的仓库管理模式足够标准化&#xf…

高校实验室危险化学品及重大危险源安全管理系统

高校实验室危险化学品及重大危险源安全管理的重要性: 保障师生安全:通过严格管理,可以有效地降低这些风险,确保师生在实验室内的安全。 确保实验教学质量:良好的危化品管理能够确保实验材料的准确性和可靠性&#xff0…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(一)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失一些关键的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

2024永久免费版CorelDRAW安装包下载附CDR2024激活码序列号

CorelDRAW2024作为一款备受关注的图形设计软件,其最新版本集成了一系列创新工具和功能,旨在提升设计师和艺术家的工作效率与创作自由度。这一版本在用户界面设计、矢量图绘制、色彩管理和文件支持等方面都进行了更新,吸引了广泛的关注。本文将…

目标检测基础初步学习

目标检测(Object Detection) 目标检测任务说明 在动手学习深度学习中对目标检测任务有如下的描述。 图像分类任务中,我们假设图像中只有一个主要物体对象,我们只关注如何识别其类别。 然而,很多时候图像里有多个我们…

【C++软件调试技术】什么是pdb文件?如何使用pdb文件?哪些工具需要使用pdb文件?

目录 1、什么是pdb文件? 2、如何配置生成pdb文件? 3、pdb文件的时间戳和文件名称 3.1、pdb文件的时间戳 3.2、pdb文件的文件名称 4、有pdb文件才能在Visual Studio中调试代码 5、在Windbg中使用pdb文件 5.1、使用lm命令查看二进制文件的时间戳&a…

翻译《The Old New Thing》- Why do atoms start at 0xC000?

Why do atoms start at 0xC000? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080429-00/?p22543 Raymond Chen 2008年04月03日 有两种类型的原子,即所谓的整数原子,它们只是一些小整数,还有就是没有…

GE的六西格玛是怎么成功的?

六西格玛作为一种先进的质量管理方法,旨在通过消除缺陷、提高流程效率来降低成本、增强客户满意度。GE作为最早采用六西格玛的公司之一,其成功的原因首先离不开高层领导对精益六西格玛理念的坚定支持和推动。公司高层不仅亲自参与培训和项目实践&#xf…

何为云防护?有何作用

云防护又称云防御。随着Internet互联网络带宽的增加和多种DDOS 黑客工具的不断发布,云计算越演越热,DDOS拒绝服务攻击的实施越来越容易,DDOS攻击事件正在成上升趋势。出于商业竞争、打击报复和网络敲诈等多种因素,导致很多IDC 托管…

一分钟了解香港的场外期权报价

香港的场外期权报价 在香港这个国际金融中心,场外期权交易是金融市场不可或缺的一部分。场外期权,作为一种非标准化的金融衍生品,为投资者提供了在特定时间以约定价格买入或卖出某种资产的机会。对于希望参与这一市场的投资者来说&#xff0…

电脑记事本怎么恢复之前的内容记录

每个人都曾有过这样的时刻——在记事本上精心记录下的重要内容,一不小心就被删除了。那种心情,仿佛一瞬间从山顶跌落到谷底,无尽的懊悔涌上心头。我也曾遭遇过这样的困境,那些消失的文字对我来说意义非凡,它们的丢失仿…

基于小波变换贝叶斯LMMSE估计的图像降噪方法(MATLAB 2018)

自从小波被发现以来,由于其优良的时频局部化性能,大大解决了信号与图像降噪的难题。利用小波降噪大致有三种方法,分别是基于小波模极大值原理、基于小波变换系数的相关性,和最为常用的小波阈值函数法。 基于小波模极大值降噪 该…

AI程序员来了,大批码农要失业

根据GitHub发布的《Octoverse 2021年度报告》,2021年中国有755万程序员,排名全球第二。 ChatGPT的出现,堪比在全球互联网行业点燃了一枚“核弹”,很多人都会担心“自己的工作会不会被AI取代”。 而2024年的AI进展速度如火箭般&am…

S4 BP 维护

前台输入Tcode:BP 问候填写金税开票信息使用的开户行名称,注释填写金税开票信息使用的开户行代码 屏幕下滑按需填写其他数据,如:街道2,街道3,街道/门牌号,街道4,街道5,区域,邮编、城市、国家、地区、语言,电话(发票地址里的电话(必须是客户开票资料里提供的电话,会…

【MyBatisPlus】MyBatisPlus条件查询

【MyBatisPlus】MyBatisPlus条件查询 文章目录 【MyBatisPlus】MyBatisPlus条件查询1、查询条件方式2、组合条件3、NULL值处理4、查询投影-设置【查询字段、分组】5、查询条件6、字段映射与表名映射问题导入 1、查询条件方式 MyBatisPlus将书写复杂的SQL查询条件进行了封装&…