【面试原型链】前端面试那些事(1)之原型链详解

news2024/12/23 15:09:18

【写在前面】辞旧迎新的春季佳节,在这里博主先祝各位看官新的一年赚钱多多,知识满满,年后谈到面试, 好多人在面试的时候就倒在原型链知识点上面,主要原因还是基本功不够扎实,针对以前的知识我也计划在2023年进行一个梳理与总结,希望能够给大家带来一个全新的理解与认识,希望这篇文章能终结您的原型链知识盲区。

文章目录

  • 1、什么是原型链
    • 1.1原型是啥?
    • 1.2 prototype 和 __proto__ 的区别与作用
      • A、存在体的区别
      • B、继承的作用
      • C、prototype作用又是体现在哪?

1、什么是原型链

1.1原型是啥?

说到原型我们先谈对象吧,简而言之:原型存在于对象,没有对象别和我谈原型!
原型简单来说就是:对象的内置[[Prototype]]属性;
复杂来说就是:每个构造函数内部都会存在一个prototype属性,这个属性的值才是对象,该对象包括了构造函数所有实例所共享的属性和方法,当我们通过构造函数去创建一个对象的时候,这个对象就会有一个指针,这个指针会指向构造函数的prototype的值,其实我们将这个指向prototype的指针称之为原型;
结合实例讲解:

//对象函数(构造函数)
    function duixiang() {
        this.sex = "女";//设置对象的性别
    }

其中你在控制台尝试输出构造函数的prototype属性:
在这里插入图片描述
不难发现,其还包括了__proto__ 这个属性,那么prototype 和 proto 究竟有什么区别和联系呢?

1.2 prototype 和 proto 的区别与作用

A、存在体的区别

首先prototype是函数所有的,实例对象是没有这个属性的,函数就是function;
然而__proto__不只是在函数Function中存在,在对象object中也存在;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

B、继承的作用

对继承概念不熟悉的可以先了解一下继承概念再来看看哈,接触过java的应该都知道java是通过类和类之间实现继承的,但是JavaScript没有类,有对象,是故继承只能通过对象与对象之间来实现继承。
那么我先基于对象的概念写一个实例让大家更加快速接受js中的继承。
古时候有个富商家有四个千金去相亲,富商说,你们每个人都要写出自己的要求;
大小姐要求是:年龄在18到45岁之间的;
二小姐要求是:身高得150到180之间的;
三小姐要求是:只要孝顺、阳光就行;
四小姐却迟迟不能下笔,说这能不能我把三位姐姐的要求全拿过来啊,我要求都得满足。
富商就说:你还没学继承呢,怎么能做这种事情,于是乎找到博主我帮忙了,下面我就给这个富商罗列了一下原型继承的代码;

//相亲条件1的大小姐,只有年龄的限制
    let tj1 = { age: "年龄在18-45岁" };
    //相亲条件2的二小姐,只有身高的限制
    let tj2 = { height: "身高在150cm-180cm" };
    //相亲条件3的三小姐,只有品质的限制
    let tj3 = { quality: "性格得孝顺,阳光" };
    //相亲条件4的四小姐,啥都没想好
    let tj4 = {};

    //博主的努力下
    tj4.__proto__ = tj1;
    console.log("四小姐的要求:" + tj4.age);
    console.log("四小姐的要求:" + tj4.height);
    console.log("四小姐的要求:" + tj4.quality);
    //输出
    //四小姐的要求:年龄在18-45岁
    //四小姐的要求:undefined
    //四小姐的要求:undefined
    tj4.__proto__ = tj2;
    console.log("四小姐的要求:" + tj4.age);
    console.log("四小姐的要求:" + tj4.height);
    console.log("四小姐的要求:" + tj4.quality);
    //输出
    //四小姐的要求:undefined
    //四小姐的要求:身高在150cm-180cm
    //四小姐的要求:undefined
    // 【结论】重新赋值会不覆盖
    tj2.__proto__ = tj1;
    console.log("四小姐的要求:" + tj4.age);
    console.log("四小姐的要求:" + tj4.height);
    console.log("四小姐的要求:" + tj4.quality);
    //输出
    //四小姐的要求:年龄在18-45岁
    //四小姐的要求:身高在150cm-180cm
    //四小姐的要求:undefined
    // 【结论】直接修改他指向的tj2的原型就可以让他也拥有,这就是继承的概念
    tj1.__proto__ = tj3;
    console.log("四小姐的要求:" + tj4.age);
    console.log("四小姐的要求:" + tj4.height);
    console.log("四小姐的要求:" + tj4.quality);
    //输出
    //四小姐的要求:年龄在18-45岁
    //四小姐的要求:身高在150cm-180cm
    //四小姐的要求:性格得孝顺,阳光
    // 【结论】其实这个就形成了一条链了,tj4指向tj2,tj2指向tj1,tj1指向tj3,这样的一条原型链使得tj4拥有tj1/tj2/tj3的三个条件

看到这里。
富商直呼:你真乃神人耶,龄几何,可婚配?
我笑而不语…大家可以在评论区留下你们的神评哈;

C、prototype作用又是体现在哪?

不免会有居心叵测之人在问,你一直在用__proto__说事,那么能不能给我唠唠prototype这个玩意究竟干了些啥,具体作用又怎么体现出来的?
这个时候我就要踩一脚__proto__了,这个其实不是官方定义的标准属性,所以在把Function当做构造函数使用的时候,需要借助prototype属性来模拟类与类之间的继承模式。
当然这个主要是针对函数来说的,首先刚才我们new了一个函数对象,那么我们去想一想new的对象类型是object,但是赋值的是一个函数function类型,下面我将new的过程给大家描述一下子哈;

//对象函数(构造函数)
    function duixiang() {
        this.sex = "女";//设置对象的性别
    }
    var xqdx = new duixiang("男");

第一步:执行duixiang 函数,duixiang函数会在xqdx的作用域(作用域后面会有专文介绍)下被执行,其中里面的this就是对象实例xqdx,从而xqdx对象就会拥有性别属性,默认为女,传男也没用;
在这里插入图片描述
第二步:继承函数体内属性和方法的原理其实是xqdx.__proto__指向了duixiang.prototype,这就是构造函数的精髓,从而才有属性和方法的继承。
在这里插入图片描述
总结一下:

__proto__是真正用来查找原型链去获取方法的对象。
prototype是在用new创建对象时用来构建__proto__的对象;
所以说,针对构造函数的属性继承,没有prototype的话,__proto__屁都不是;

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

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

相关文章

C语言小题,通过指向结构体变量的指针变量输出结构体变量中成员的信息。(指针结构体变量的指针)

前言: 此篇是针对 指针结构体变量的指针 方面的练习。 解题思路: 在已有的基础上,本题要解决两个问题: (1)怎样对结构体变量成员赋值; (2)怎样通过指向结构体变量的指针…

天云数据:Hubble数据库系统自主研发率99.62%,是真正的信创数据库

软件是新一代信息技术的灵魂,是数字经济发展的基础,是制造强国、网络强国、数字中国建设的关键支撑。2021年,工信部印发的《“十四五”软件和信息技术服务业发展规划》明确指出,要聚力攻坚基础软件,关键基础软件补短板…

Javascript基础复盘5

内置对象 值属性 这些全局属性返回一个简单值,这些值没有自己的属性和方法。 InfinityNaNundefinedglobalThis函数属性 全局函数可以直接调用,不需要在调用时指定所属对象,执行结束后会将结果直接返回给调用者。 eval()uneval()isFinite()isN…

Q-Learning以及.NET环境下的实现

Q-Learning以及.NET环境下的实现写在前面机器学习Q-Learning环境准备试题准备解题过程写在结尾写在前面 看过我的文章的朋友应该都知道,我之前一直在研究视觉相关的知识,也看了一些卷积神经网络(CNN),深度学习相关的文…

强化学习之:价值学习Value-Based Learning

文章目录参考内容动作价值函数(Action-value Function)深度强化学习(DQN)学习目标(Goal)如何获得尽可能好的 Q∗(st,a)→Q^{*}(s_t, a) \rightarrowQ∗(st​,a)→ 用神经网络通过学习获得时间差分算法&…

cocos creater 3.x 开发笔记(踩坑总结)

1、cocos creater 3.x 花屏闪屏黑屏 1.1 花屏 排序是一个很简单的功能,但是最终的呈现却是根据不同平台提供的渲染能力来的。因此,在这里说明一下,如果遇到了 UI 渲染出错,花屏,闪屏等现象,首先要检查的就…

【安装合集】Mysql8.0安装 2023年1月31日 22点15分

1.鼠标右击【Mysql8.0】压缩包选择【解压到Mysql8.0】。 2. 鼠标右击【mysql-installer-community-8.0.17.0】选择【安装】 3. 勾选【I accept the license terms】然后点击【Next】。 4. 选择【Custom】然后点击【Next】。 5. 双击【MySQL Servers】 双击【MySQL Server】&am…

数据指标体系的建设思考(四)

这一篇主要介绍对数据指标体系的价值、数据指标管理平台的理解及数据分析的趋势解读。 一、数据指标体系价值 关于数据指标体系的价值,我想大多数从事数据工作的人员都可以感受得到,毕竟数据指标的输出可以通过可视化的方式(如大屏、驾驶舱…

Linux 中去除 vi/vim 和 git diff 中的 ^M 问题解决办法

去除 vi/vim 和 git diff 中的 ^M 问题解决办法问题现象初步分析进一步查看问题解决Source Insightdos2unixNodpadVimsed 命令综上Reference问题现象 git diff 时发现下面的情况,新修改的代码之处都是携带 ^M 字符, 初步分析 肯定是因为 Windows 和 …

推荐5款常用的有限元分析CAE软件

正如我们之前谈到的,计算机辅助软件有助于进行有限元分析。但是我们如何识别好的 CAE 软件呢?CAE 软件必须满足以下要求才能被纳入其类别使用户能够通过图形用户界面 (GUI) 创建模拟允许在模拟中测试组件,同时具有可自定义的环境变量协助优化…

JAVA队列-接口

前言 说到队列,大家都不陌生,很多场景都需要使用到队列,今天我们一起学习JDK提供的队列源码 类图 Queue接口的实现类有很多 从中,我们看到几个熟悉的,BlockingQueue 阻塞队列、Deque 双端队列 Queue 官方介绍: A collection designed for holding elements prior to proce…

MORPHVOX PRO 变声器 软件 Crack

MORPHVOX PRO 变声器 变音的全新层次 在网上聊天和游戏中使你变音 它具有超高语音学习技术,背景取消和高音质特点,将变音带向全新层次。 上好的变音质量 聆听MorphVOX Pro上好的变音质量。 *变音的音频因人而异,但它确实是同一个说话者发出…

国内爬虫图鉴

文章目录爬虫图鉴1.三个问题2.互联网上的爬虫2.1豪哥与爬虫2.2爬虫简介2.3APP身边的爬虫2.4爬虫排名1、排名第一的是出行2、排名第二的是社交。3、排名第三的是电商。4、接下来是 O2O 和搜索引擎。5、最后再说说政府部门。3.关于爬虫的几点疑问4.爬虫的TopN爬虫图鉴 本文案例来…

【数学建模】层次分析法(AHP)-Python实现

1 前言 本文主要讲解层次分析法(AHP)的python实现,后续会跟进实例分析 2 代码实现 导入包 import numpy as np2.1 构造判断矩阵 判断矩阵一般采用专家意见法,也就是德尔菲法。但是比赛的时候也没有什么专家,大家自…

2019-arXiv-Edge Contraction Pooling for Graph Neural

2019-arXiv-Edge Contraction Pooling for Graph Neural Paper: https://arxiv.org/abs/1905.10990 Code: https://github.com/pyg-team/pytorch_geometric/tree/master/benchmark/kernel 图神经网络的边缘收缩池化 池化层可以使GNN对抽象的节点组而不是单个节点进行推理。为…

【基础篇】5 # 链表(下):写好链表代码的六个实用技巧

说明 【数据结构与算法之美】专栏学习笔记 技巧一:理解指针或引用的含义 指针或引用都是存储所指对象的内存地址。将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针。 例如: p —> next q:表示 p 结点中的 ne…

opencv——Canny边缘检测

1、Canny边缘检测流程a、使用高斯滤波器,以平滑图像,滤除噪声。b、计算图像中每个像素点的梯度强度和方向。c、应用非极大值抑制,以消除边缘检测带来的杂散效应。d、应用双阈值检测来确定真实的和潜在的边缘。e、通过抑制孤立的弱边缘最终完成…

webpack4和webapck5的及新特性

30.webpack——webpack5新特性(启动、持久化缓存、资源模块、URIs、moduleIds和chunkIds、tree shaking、nodeJs的polyfill被移除、模块联邦)_俞华的博客-CSDN博客_chunkids 1、新特性1——启动命令 webpack4启动devServer,用的命令是webpac…

clickhouse库通过字段分组后获取排序后每天的前N条数据

各种查资料,都没找到,建议还是多看文档 方法1 :简单便捷: order by date,count desc limit 5 by date (取每天前5条数据,5可以随便换) sql可以随便写: 统计每天学生人数,按降序排序&#xff…