一文了解原型和原型链

news2024/10/5 20:22:29

本文重点概念:

1、所有的对象都是new一个函数创建的

2、所有的函数都有一个属性prototype,称为函数原型

3、函数原型得到的这个对象都有一个属性constructor,指向该函数

4、所有的对象都有一个属性:隐式原型__proto__,隐式原型指向创建该对象的函数的原型

5、原型链就是一直寻找__proto__,直到最终指向null

特殊:Function的隐式原型指向Function的原型

           Object.prototype.__proto__ === null

1、所有的对象都是通过new一个函数创建的

var obj= {

};

这个{}是一个语法糖,本质其实就是var obj = new Object();

看一下这张图

function test() {
}
console.log(new test());//得到的是一个test对象,即构造函数是test
function test() {
    return {};
}
console.log(new test());//得到的是一个Object对象,即构造函数是Object

2、所有的函数也是对象

所有的函数都是通过new一个Function来产生的,Function本身比较特殊,他是JS引擎启动时,自动就放在内存里的

函数中可以有属性

像Array.isArray这种的

3、所有的对象都是引用类型

4、所有的函数都有一个属性:prototype,称之为函数原型

比如说Object.prototype,Array.prototype

5、默认情况下,prototype是一个普通的Object对象

6、默认情况下,函数的prototype得到的这个对象,它有一个属性,constructor,他也是一个对象,他指向构造函数本身

 看下面这张图

所以说Array.prototype.constructor === Array一定为真

7、 所有的对象都有一个属性:__proto__,称之为隐式原型

8、默认情况下,隐式原型指向创建该对象的函数的原型。

来个面试题

function A(){}
function B(){}
function create() {
    if (Math.random() < 0.5) {
        return new A();
    } else {
        return new B();
    }
}
var obj = create();
// 如何得到创建obj的构造函数的名称
// 任何对象都有隐式原型,隐式原型指向创建它的构造函数的原型
// obj.__proto__ === A/B.prototype
// 原型里有一个constructor,表示这个原型是那个构造函数创建的
// obj.__proto__.constructor.name

看看这张图

 

 

// 共用内存空间的体现
function User(name,age){
    this.name = name;
    this.age = age;
    this.sayHello = function(){
        console.log('hello');
    };//这种情况下该函数没有共用同一块内存空间 u1.sayHello === u2.sayHello false
}

User.prototype.sayHello = function(){
    console.log('hello');
};//这种情况下该函数是共用的同一块内存空间 u1.__proto__.sayHello === u2.__proto__.sayHello true

var u1 = new User('a',11);
var u2 = new User('b',12);

9、 当访问一个对象的成员时

1)看该对象自身是否拥有该成员,如果有直接使用

2)看该对象的隐式原型是否拥有该成员,如果有直接使用

比如上边就可以通过u1.sayHello()直接使用

3)在原型链中,依次寻找隐式原型

10、猴子补丁:在函数原型中加入成员,以增强对象的功能,但是会造成原型污染,使用需谨慎

11、原型链

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

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

相关文章

计算机网络—OSPF单区域配置

目录 目录 1.实验环境准备 2.配置 OSPF 3.验证 OSPF 配置 4.修改 OSPF hello 和 dead 时间参数 5.OSPF缺省路由发布及验证 6.控制 OSPF DR/BDR 的选举 7.配置文件 拓扑图&#xff1a; 1.实验环境准备 基本配置以及IP编址。 <Huawei>system-view Enter system vi…

Python中的运算符介绍

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

四节点/八节点四边形单元悬臂梁Matlab有限元编程 | 平面单元 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

关于比特币的AI对话

【ChatGPT】 比特币源码开源吗&#xff1f; 是的&#xff0c;比特币的源码是开源的。比特币项目是在MIT许可证下发布的&#xff0c;这意味着任何人都可以查看、修改、贡献和分发代码。比特币的源码托管在GitHub上&#xff0c;可以通过下面的链接进行访问&#xff1a; https://g…

一个超冷门的 Vue3 内置组件,帮我优化了66%的性能!

背景 最近项目中有一个页面&#xff0c;是之前的老页面&#xff0c;页面中的内容其实就是一个 Tabs 组件&#xff0c;有三个 Tab&#xff0c;分别展示不同的内容&#xff0c;但是也有共同内容&#xff0c;那就是共同都有一个一个报表组件 下面是大致的代码展示如下&#xff0c…

pyqt线程正确使用

PyQt之科学使用线程处理耗时任务以及线程通信方法 上面这篇文章看似很科学… 经过实际测试&#xff0c;需要按下面创建线程&#xff1a; self.work EmailWork() self.thread QtCore.QThread() self.thread.start()self.work.moveToThread(self.thread) self.work.complete_…

聚观早报 | 天猫2024年投入5亿元;英伟达市值再创新高

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 3月11日消息 天猫2024年投入5亿元 英伟达市值再创新高 IAR全面支持小华全系芯片 紫光云发布紫鸾5.0云平台 首家…

大话设计模式——5.代理模式(Proxy Pattern)

1.定义 为其他具体对象提供一种代理用以控制对这个对象的访问&#xff0c;属于结构型模式。 UML图&#xff1a; 2.示例 生活中有许多的代理&#xff0c;如房产中介&#xff0c;房主出售的房子挂在中介处&#xff0c;中介帮忙寻找需要的客户&#xff0c;客户不需要直接接触房…

YOLOv9环境搭建推理测试

引子 对于CV从业者来说&#xff0c;YOLO系列是个绕不过的经典结构&#xff0c;笔者遥想当年YOLO横空出世的时候&#xff0c;Faster RCNN还是学术界目标检测的翘楚。二阶段检测还是大行其道&#xff0c;不过时至今日&#xff0c;估摸着没有人再提二阶段目标检测的结构了。YOLO系…

【软件测试面试】银行项目测试面试题+答案(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 面试题&#xff1…

ChatGPT+MATLAB应用

MatGPT是一个由chatGPT类支持的MATLAB应用程序&#xff0c;由官方Toshiaki Takeuchi开发&#xff0c;允许您轻松访问OpenAI提供的chatGPT API。作为官方发布的内容&#xff0c;可靠性较高&#xff0c;而且也是完全免费开源的&#xff0c;全程自己配置&#xff0c;无需注册码或用…

【超级干货】播放器核心知识点-音视频同步原理深入剖析

引言 本文是自己学习利用ffmpeg实现音视频同步播放的总结文档,参考了网上一些博客,同时调试ffplay源码进行理解,站在巨人的肩膀上学习,感谢开源和分享精神。文中粘贴的代码每行都有注释,确保读者能理解所涉函数的每一行代码的意义。 章节 因为ffplay源码阅读起来比较复…

TripoSR:开源3D重建模型,0.5秒就能完成2D到3D图转换

TripoSR是由Tripo AI和Stability AI合作开发的最先进的开源模型&#xff0c;用于从单个图像中快速前馈3D重建。在NVIDIA A100 GPU上不到0.5秒就能生成高质量的3D模型。 项目链接 https://github.com/VAST-AI-Research/TripoSR TripoSR利用大型重建模型(LRM)的原理&#xff0c;…

恒峰便携式森林灭火泵:森林守护者的强力助手

在茂密的森林中&#xff0c;一场突如其来的火灾可能会带来无法估量的破坏。这不仅会对生态环境造成严重影响&#xff0c;还可能危及人类和动植物的生命安全。为了应对这种突发情况&#xff0c;恒峰研发出了一种便携式森林灭火泵&#xff0c;它成为森林守护者的强力助手。 首先&…

32个关键字详解①(C语言)

目录 关键字分类&#xff1a; 第一个C程序 - 补充内容 变量的定义与声明 - 补充内容 变量的分类 - 补充内容 变量的作用域 - 补充内容 变量的生命周期 - 补充内容 auto 关键字 register 关键字 static 关键字 static 修饰变量&#xff1a; static修饰函数 sizeof 关键字 基本数…

解决windows无法识别外接显示器问题

文章目录 1. 问题2. 解决方法2.1 先尝试重启2.2 检查设备驱动 1. 问题 windows 系统在接入其他显示器时&#xff0c;发现另一个显示器没有生效 2. 解决方法 2.1 先尝试重启 首先你应该至少先尝试重启一次电脑&#xff0c;万能的重启方法&#xff01; 2.2 检查设备驱动 如…

hadoop报错:HADOOP_HOME and hadoop.home.dir are unset. 解决方法

参考&#xff1a;https://blog.csdn.net/weixin_45735242/article/details/120579387 解决方法 1.下载apache-hadoop-3.1.0-winutils-master 官网下载地址&#xff1a; https://github.com/s911415/apache-hadoop-3.1.0-winutils win配置系统环境&#xff1a; 然后重启idea…

【Python从入门到进阶】50、当当网Scrapy项目实战(三)

接上篇《49、当当网Scrapy项目实战&#xff08;二&#xff09;》 上一篇我们讲解了的Spider与item之间的关系&#xff0c;以及如何使用item&#xff0c;以及使用pipelines管道进行数据下载的操作&#xff0c;本篇我们来讲解Scrapy的多页面下载如何实现。 一、多页面下载原理分…

Git LFS【部署 01】Linux环境安装git-lfs及测试

Linux系统安装git-lfs及测试 1.下载2.安装3.测试4.总结 Git LFS&#xff08;Large File Storage&#xff09;是一个用于Git版本控制系统的扩展&#xff0c;它专门用来管理大型文件&#xff0c;如图像、音频和视频文件。 1.下载 安装包下载页面&#xff1a;https://github.com/…

数据结构入门篇 之 【单链表】的实现讲解(附单链表的完整实现代码以及用单链表完成通讯录的实现代码)

虽然封面是顶针&#xff0c;但是我们还是要好好学习❀ 一.单链表 1.单链表的概念 2.单链表的结构 3.单链表的实现 1&#xff09;.尾插函数 SLTPushBack 2&#xff09;.打印函数 SLPrint 3&#xff09;. 头插函数 SLTPushFront 4&#xff09;.尾删函数 SLTPopBack 5&am…