你会知道有关原型与原型链题的那些事~

news/2024/5/17 18:47:03/文章来源:https://blog.csdn.net/qq_53225741/article/details/127328587

你还会想知道的有关的原型

在之前总结中,有总结到一些关于原型与原型链的知识点。本来还想加一下各类笔试中,有关原型与原型链的题目,后面忙着忙着给忘了,现在补上,同时也加深一下自己的理解。

首先还是得把这个图先放置出来,重新好好理解,方便给后面的解释能好好摸鱼

特别需要提醒一点:

Object 实例化对象__proto__ 是指向 Object.prototype

而 Object 本身 __proto__ 是指向 Function.prototype

即是任何一个能new对象的构造器,都是Function实例化的结果(正如 函数是一类公民的说法一样

简单说就是构造器 __proto__ 是指向 Function.prototype

基础

function f1(tname) {if(tname) {this.tname = tname}
}
f1.prototype.tname = 'change'
Object.prototype.tname = 'Object change'
Function.prototype.tname = 'function change'
const ff = new f1()
console.log(ff.tname) // change 

解释:(直接上图理解

所以在实例后的f,找属性,在本身找不到的情况下,会向原型对象去查找

最终输出 change

同理如果题目改成:

function f1(tname) {
++this.tname = tname
}
f1.prototype.tname = 'change'
Object.prototype.tname = 'Object change'
Function.prototype.tname = 'function change'
const ff = new f1('no change')
console.log(ff.tname) 

那最终会输出 no change

进阶

Array.a =1
Array.prototype.a = 2
Function.prototype.a = 3
Object.prototype.a = 4
var arr = []
console.log(arr.a);
console.log(arr.length.a);
console.log(arr.forEach.a);
console.log(Function.a);
console.log(Object.a); 

输出结果为:

2
4 
3
3
3 

不知道这次伙伴们能不能做对呢,可能在最后一个输出上有点疑惑,现在就好好学习加以解释一下

解释:

第一个输出: console.log(arr.a) // 2

首先要明确一点 arr = []arr = new Array() 的申明方式是一样的

因此 会存在 arr.__proto__ = Array.prototype

所以 arr 在本身中找不到原型 就向原型对象查找 最后是找到 2 的数据

第二个输出console.log(arr.length.a) // 4

首先先进行一层层解析

arr.length 输出的是 arr 数组的长度 再去输出 该长度下 a 的值

有一点很特殊: 长度?(Number数据类型 原始数据类型会有 a 的属性?)

所以,在这里需要转一个弯

原始数据会有自己的 __proto__ 指向他的构造器的原型对象的

const num = 1
const str = 'str'
const bool = true
const tbigint = 10n
​
console.log(num.__proto__) // 输出Number原型对象
console.log(str.__proto__) // 输出String原型对象
console.log(bool.__proto__) // 输出Boolean原型对象
console.log(tbigint.__proto__) // 输出Bigint原型对象
​
console.log(num.__proto__.__proto__ === Object.prototype) //true
console.log(str.__proto__.__proto__ === Object.prototype) //true
console.log(bool.__proto__.__proto__ === Object.prototype) //true
console.log(tbigint.__proto__.__proto__ === Object.prototype) //true 

所以最终都会指向 Object.prototype, 输出 4

第三题输出console.log(arr.forEach.a) // 3

大概解释和上面差不多的,同样需要一层层解构

先对 arr.forEach 的 a 属性进行输出

arr.forEach 是一个方法,所以先在本身方法查找有无该属性, 没有就从原型对象查找 Funtion.prototype

最终输出 3

第四题输出console.log(Function.a) // 3

还是之前的知识点

Function.__proto__ = Function.prototype

因此输出 3

第五道输出console.log(Object.a) // 3

首先函数是第一类公民,一切的Object可以说都是函数的实例化的结果

所以再结合上面的图,很快就能得出结果了

所以最后输出 3

最后

最近还整理一份JavaScript与ES的笔记,一共25个重要的知识点,对每个知识点都进行了讲解和分析。能帮你快速掌握JavaScript与ES的相关知识,提升工作效率。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

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

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

相关文章

实操演练 | 探索数据库中的枚举ENUM(存储、验证、插入和检索)

在信息技术领域,俗称 IT 领域,枚举(ENUM)是一种特殊的数据类型,它封装了一组预定义的常量。因此,变量可能只保存枚举的其中一个预定义的值。常见的示例包括指南针方向(東、南、西、北&#xff0…

东华大学 2022 oj c++ 无超纲写法 简单易懂 日期

//没有技巧&#xff0c;没有感情 AC代码&#xff1a; #include <stdio.h> #include<iostream> #include<string> #include<bits/stdc.h> using namespace std; int main() { char day[4]; char day1[4] { M,o,n }; char day2[4] { T,u,…

【WPF】Tabcontrol的IsSynchronizedWithCurrentItem属性

如果两个控件都绑定到同一个源(ObservableCollection)集合视图时,该对象会自动绑定到该视图的 CurrentItem。请注意,CollectionViewSource 对象会自动同步货币与所选内容。如果列表控件没有像示例中那样绑定到 CollectionViewSource 对象,则您需要将其 IsSynchronizedWith…

MobileBERT: a Compact Task-Agnostic BERT for Resource-Limited Devices(2020-4-6)

模型介绍 近年来&#xff0c;自然语言处理(NLP)通过使用具有数亿个参数的巨大预训练模型取得了巨大的成功。然而&#xff0c;这些模型受到沉重的模型尺寸和高延迟的影响&#xff0c;因此无法部署到资源有限的移动设备上。因此这里提出了MobileBERT来压缩和加速流行的BERT模型。…

微信小程序中引导用户关注公众号实现方案详细说明

前言 之前讲过如何利用公众号针对指定用户完成业务操作之后实时发送消息.就好比在线医院公众号中看病挂号&#xff0c;挂号预约成功之后微信列表中会新增一条关注的公众号预约成功消息.具体实现步骤可以看下文章如何实现&#xff1a;手把手教你微信公众号如何给指定用户发送消息…

瑞吉外卖06-分页查询

瑞吉外卖06-分页查询 需求分析 问题描述 解决方案 对于createTime、updateTime字段 对于createUser、updateUser字段 代码实现 知识点分析 ThreadLocal 本次功能代码实现&#xff08;免费&#xff09; 瑞吉外卖06-分页查询 需求分析 问题描述 前面我们已经完成了…

嵌入式分享合集76

一、推挽、开漏、OC、OD 与推挽输出相对的是开漏输出&#xff0c;而开漏输出分为OC、OD两种&#xff0c;下文分别详细介绍。 推挽输出 推挽输出&#xff08;Push-Pull Output&#xff09;是由两个MOS或者三极管受到互补控制信号的控制&#xff0c;两个管子始终处在一个导通另一…

解决github分支提交冲突

一、背景 github上fork了base仓库 648540858/wvp-GB28181-pro 到自己仓库&#xff0c;并进行了个性化更改。base仓进行了代码更新&#xff0c;此时我和base仓有了冲突如何解决&#xff1f; 思路&#xff1a;自己仓库的代码合并到主仓是Pull Requests&#xff0c;两个不同仓库or…

PDF怎么转图片?建议收藏这些方法

PDF是我们在传输文件的时候&#xff0c;经常会使用到的一种格式。它可以帮助我们在不同的设备上&#xff0c;打开文件并且不会影响到文件内容的文字结构。而jpg是一种常见的图片格式&#xff0c;有时我们可能会遇到PDF转jpg的情况&#xff0c;那你们知道PDF转jpg怎么转吗&#…

git push 所有分支到新仓库地址

例&#xff1a;从gitee上拉取test-code代码&#xff0c;到自己新仓库地址,test-code仓库有master和test两个分支&#xff1b;具体命令和结果如下 xxxxxxxxopen02:~/src/code/tmp$ git clone gitgitee.com:striver-wy/test-code.git //从gitee下载代码 Cloning into test-code..…

CVPR2022-Rethinking Efficient Lane Detection via Curve Modeling

概述 总结分析了当前&#xff08;图像&#xff09;车道线检测的三类方法&#xff0c;为了解决现有多项式曲线方法的优化困难&#xff0c;提出了使用参数贝塞尔曲线拟合车道线的方案。此外还提出了基于变形卷积的特征翻转融合&#xff0c;以利用驾驶场景中车道的对称特性。 Pape…

Mysql基于binlog日志恢复数据

Mysql基于binlog日志恢复数据 1.Linux安装mysql https://blog.csdn.net/qq_44981526/article/details/126717005 可能遇到的问题 1.net-tools未安装&#xff0c;执行yum install net-tools 2.远程连接工具连接不上mysql grant all privileges on *.* to root% identified…

R语言caret机器学习(四):数据拆分

【R语言数据科学】 🌸个人主页:JOJO数据科学📝个人介绍:统计学top3高校统计学硕士在读💌如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏、👍订阅专栏✨本文收录于【R语言数据科学】本系列主要介绍R语言在数据科学领域的应用包括: R语言编程基础、R语言可视化、R…

垃圾分类查询管理系统

垃圾分类查询管理系统1.介绍1.1 功能点2.软件架构3.安装启动4.运行截图参考网站&#xff1a;https://lajifenleiapp.com/ 1.介绍 垃圾分类查询管理系统&#xff0c;对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾&#xff0c; 按国家标准自己分类&…

【最详细最全】Github的jenkins的自动化部署

1>创建项目 2>General 设置 3>配置源码管理 1>勾选Git选项之后&#xff0c;就会出现相关的填写项&#xff0c;根据下图的指引来填写就行了 填写项目的 git 地址, eg&#xff1a; GitHub - Leader755/leader755.github.io: github 博客&#xff08;hexo一键搭建博…

(附源码)计算机毕业设计SSM基于Java的图书馆座位预约系统

&#xff08;附源码&#xff09;计算机毕业设计SSM基于Java的图书馆座位预约系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 …

Torch网络结构/训练过程可视化

一、网络结构的可视化 我们训练神经网络时&#xff0c;除了随着step或者epoch观察损失函数的走势&#xff0c;从而建立对目前网络优化的基本认知外&#xff0c;也可以通过一些额外的可视化库来可视化我们的神经网络结构图。这将更加地高效地向读者展现目前的网络结构。 为了可…

ARM接口技术:汇编语言实现1~100的累加,1+2+3+4+...+99+100=?还有汇编语言程序的编译和运行步骤

进入正题&#xff1a; 在终端输入&#xff1a;vi sum.S&#xff0c;建立文件 1、编写代码&#xff1a;定义两个变量&#xff0c;r0、r1 .global _start _start:mov r0,#1mov r1,#0 sum:add r1,r0add r0,#1cmp r0,#100bgt endb sumend:mov r2,r1nopnopnop2、编译建立一个makefi…

客流管控系统可以协助博物馆进行人数管理

进入21世纪&#xff0c;我国的博物馆建设迎来了新的高潮&#xff0c;无论是数量&#xff0c;还是规模&#xff0c;都前所未有。目前&#xff0c;全国的博物馆总数已经达到5 000多座&#xff0c;为了管控博物馆的人数&#xff0c;很多博物馆都安装了客流管控系统。客流管控系统可…

Android 开发学习(一)

文章目录1. Android 安装2. 创建第一个Android项目3. 什么是Gradle&#xff1f;4. 运行第一个Android程序5. Android架构 介绍6. 控件 之 textView(文本)6.1 textView 基础语法6.2 带阴影的textView6.3 跑马灯效果的 textView7. 控件 之 Butto(按钮)7.1 Button 的 基本属性 和 …