理解原型和原型链

devtools/2024/9/24 21:24:52/

当你理解JavaScript中的原型和原型链,你就能理解为什么JavaScript中一切皆对象,以及为什么函数也是对象。让我帮你梳理一下。

原型 (Prototype)

在JavaScript中,每个对象都有一个原型对象(prototype)。当你创建一个对象时,JavaScript会自动为这个对象分配一个原型,并且你可以通过 proto 属性来访问这个原型对象。

javascript">let obj = {}; // 创建一个空对象
console.log(obj.__proto__); // 输出:Object.prototype

原型链 (Prototype Chain)

原型链是由对象的原型对象组成的链条。当你试图访问一个对象的属性时,JavaScript引擎会首先在这个对象本身中查找,如果找不到,它会继续在原型链上查找,直到找到属性或者到达原型链的末端(即原型链为 null)。

javascript">let obj = {};
obj.toString(); // 查找toString方法,如果obj对象本身没有,则会在它的原型链上查找

构造函数 (Constructor)

构造函数是用来创建对象的函数。在JavaScript中,构造函数也是函数,因此它们也有原型,并且可以创建其他对象的实例。

javascript">function Foo() {} // 定义一个构造函数
let fooInstance = new Foo(); // 创建Foo的一个实例
console.log(fooInstance instanceof Foo); // 输出:true

原型和构造函数的关系

每个函数都有一个 prototype 属性,该属性指向一个对象,这个对象包含了由该构造函数创建的所有实例对象共享的属性和方法。当你创建一个新的实例时,该实例的 proto 属性会指向构造函数的 prototype 属性所指向的对象。

javascript">function Foo() {}
let fooInstance = new Foo();
console.log(fooInstance.__proto__ === Foo.prototype); // 输出:true

对象与函数的关系

在JavaScript中,函数也是对象,因此函数也有原型,并且可以作为构造函数使用。函数对象的原型链上有 Function.prototype,而 Function.prototype 的原型链上有 Object.prototype,最终指向 null。

javascript">function myFunction() {}
console.log(myFunction instanceof Function); // 输出:true
console.log(myFunction.__proto__ === Function.prototype); // 输出:true
console.log(Function.prototype.__proto__ === Object.prototype); // 输出:true
console.log(Object.prototype.__proto__); // 输出:null

总结

JavaScript中的原型和原型链是理解其面向对象特性的关键。通过原型,对象可以继承属性和方法;通过原型链,可以实现对象间的属性和方法的共享和继承;通过构造函数和函数的原型,可以方便地创建对象和实现对象间的复用。


http://www.ppmy.cn/devtools/24590.html

相关文章

【考研数学】线性代数,除了李永乐,听谁比较好?

很多人说听不懂李永乐老师,我太理解了! 因为李永乐老师的课程感觉是讲给有基础的同学听的,他默认你会后面的知识,所以,讲课的时候会串联后面的相关知识点,这样做的好处就是帮助大家建立起知识点之间的联系…

Django-admin组件

Django-admin组件 admin是django中提供的一套可视化工具:用于对ORM中定义的表进行增删改查。 1 概览 在django项目启动时,自动找到注册到admin中的所有model中定义的类,然后为这些类生成一系列的URL和视图函数,实现基本增删改查…

预训练语言模型

一.预训练模型的基本介绍 预训练模型是一种在大规模数据上训练而得的模型,通常通过无监督学习或自监督学习的方式进行。在预训练阶段,模型被训练来学习数据的内在表示,而无需标注数据或任务特定的目标函数。这种学习能力使得预训练模型可以捕…

【安卓13】谷歌桌面Launcher3屏蔽全部应用里面的部分app

1、需求 我们在做谷歌桌面时,移植了一些我们自己的应用,但是有些应用是服务型的app,不需要显示在主页,要隐藏掉 2、解决方案 方法1: 解决办法很简单,阅读源码发现,谷歌桌面添加全部应用的源…

使用FutureTask来提高接口的并发性能优化经验以及踩坑记录

背景: 批量数据采集接口,随着时间的推移,设备一次性上传的数据包越来越大,大到一次性需要处理64条数据,而每条数据需要花费大量的时间去处理,那么如果串行对任务进行处理的话,那么总时间就是N …

CHiME-8多通道远场语音识别Baseline介绍

语音领域每年都有很多比赛,每个比赛都有自己的侧重点,其中CHiME系列比赛的侧重点就是多通道远场语音识别,与其他的语音识别比赛有所区别的是,CHiME提供分布式麦克风和麦克风阵列数据,这样可以选择合适的前端算法以降低…

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因:VMware自动选择的网卡可能不对 解决:编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡,断开虚拟机网络连接后重新连接即可

从零手写实现 apache Tomcat-01-入门介绍

创作缘由 平时使用 tomcat 等 web 服务器不可谓不多,但是一直一知半解。 于是想着自己实现一个简单版本,学习一下 tomcat 的精髓。 怎么实现一个 tomcat 呢? Tomcat就像是一个用Java语言搭起来的大舞台,专门用来演出那些用Jav…