JavaScript基础 ---- 原型与原型链

JavaScript中的原型(prototype)和原型链是实现对象继承的关键概念,本篇文章通过简单代码和图形来解释原型和原型链的概念

查看完整原型链图可以拉到最下面👇👇👇

1、概念

1.1、原型是什么:

  • 原型是JavaScript中每个对象都拥有的属性,通过它可以实现对象属性的共享和继承。每个函数都有一个特殊的属性叫做 prototype,它指向一个对象,该对象的属性和方法将被继承。

1.2、为什么要有原型:

  • 数据共享和节省内存空间: 原型允许对象实例共享同一个原型对象的属性和方法。当多个对象实例基于同一个原型创建时,它们共享原型对象的属性,这节省了内存空间。修改原型上的属性会影响所有基于该原型创建的实例
  • 实现继承: 原型链的机制使得对象能够通过继承获得原型对象的属性和方法。构造函数的 prototype 属性定义了对象实例的共享属性,而实例的 __proto__ 属性指向构造函数的原型,形成继承链。这样,对象可以通过原型链访问到构造函数原型上定义的属性,实现了继承关系

1.3、prototype和__proto__的区别:

  • prototype 是函数特有的属性,用于定义对象实例的共享属性和方法。
  • __proto__ 是每个对象实例都有的属性,指向其构造函数的 prototype。它用于实现对象的链式查找,形成原型链 (null没有__proto__)

1.4、原型链是什么:

  • 原型链是一系列通过 __proto__ 相互关联的对象,它们连接起了对象和它们的原型。当访问对象的属性时,JavaScript引擎会在原型链上查找,直到找到匹配的属性或达到原型链的顶端。

2、代码 + 图文解析

我们先使用构造函数创建一个对象:

js 复制代码
function Animal () {};
// 给Animal的原型对象增加一个属性
Animal.prototype.name = 'taishan';
const monkey1 = new Animal();
const monkey2 = new Animal();
console.log(monkey1.name); // taishan
console.log(monkey1.name); // taishan

在上面的例子中,Animal函数的prototype属性指向了一个对象,这个对象正是调用构造函数创建实例的原型,即实例monkey1和monkey2的__proto__也指向该对象;

原型对象和构造函数的关系是如何呢?每个原型对象都有一个constructor属性指向与其关联的构造函数(用于记录实例是由哪个构造函数创建)。 为了验证这个结论,可以在控制台里尝试以下代码:

js 复制代码
function Animal () {};
console.log(Animal === Animal.prototype.constructor); // true

在前文中有提到原型是一个对象,那么它的原型又是什么呢?因为是对象,所以可以用Object构造函数创建它

那么Object.prototype的原型又是什么呢?通过控制台打印可以得到是null

js 复制代码
console.log(Object.prototype.__proto__); // null

由于函数本质上是对象,所以Animal构造函数和Object构造函数也必然有其__proto__属性

js 复制代码
function Animal () {};
console.log(Animal.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype); // true

需要注意的一点是Function比较特殊的地方就是Function.__proto__指向自己的Function.prototype如下图中红线标注

所以完整的原型链图如下:

相关推荐
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄4 天前
JavaScript 隐式全局变量解析
javascript
沙蒿同学4 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端
paopaokaka_luck4 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
Hilaku4 天前
为什么死磕 1px 的团队,用户体验反而更差?
前端·javascript·程序员
陈拉斯4 天前
给公司年会写了个大屏抽奖系统:动画在前端跑,凭什么说结果没被改?
javascript
yzy854 天前
Vue中下载或打开文件的JavaScript方法
前端·javascript·vue
用户298698530144 天前
在 React 中用 JavaScript 将 Word 转换为文本
前端·javascript·react.js
李少兄4 天前
深入解析 JavaScript 中的 `document` 对象
javascript