JavaScript--原型与原型链
在JavaScript中,原型(prototype)是一个非常重要且独特的概念,它在对象创建和继承方面发挥着关键作用。理解原型及其相关的机制有助于更好地理解JavaScript的对象模型,以及如何设计和使用对象和继承。
JavaScript–原型与原型链
- 所有函数都有一个特别的属性:
- prototype : 显式原型属性
- 每个函数都有一个 prototype 属性,这个属性是一个对象,它包含了可以被该函数创建的所有实例共享的属性和方法。当我们通过构造函数(使用 new 关键字)创建一个新对象时,该对象内部会链接到构造函数的 prototype 对象上。
- 主要用来实现基于原型的继承,让多个对象实例能够共享同一组属性和方法,从而节省内存。
// 每个函数都有一个prototype属性, 它默认指向一个对象(即称为: 原型对象)
function fn() {}
console.log(fn.prototype, typeof fn.prototype)//object 'object'// 原型对象中有一个属性constructor, 它指向函数对象
console.log(fn.prototype.constructor===fn)//true// 2. 给原型对象添加属性(一般都是方法)
function F() {}
F.prototype.age = 12 //添加属性
F.prototype.setAge = function (age) { // 添加方法this.age = age
}
// 创建函数的实例对象
var f = new F()
console.log(f.age)//12
f.setAge(23)
console.log(f.age)//23
- 所有实例对象都有一个特别的属性:
- __ proto __ : 隐式原型属性
- 每个JavaScript对象都拥有一个内部属性 [[Prototype]],通常可以通过 __ proto __ 访问(虽然这不是标准属性,但在大多数浏览器中是可用的)。从ES5开始,推荐使用 Object.getPrototypeOf 来获取对象的原型。
- 当试图访问对象的一个属性时,如果该对象本身没有此属性或方法,那么引擎就会尝试在其 [[Prototype]] 中查找。这构成了所谓的“原型链”。
//对象的隐式原型的值为其对应构造函数的显式原型的值
function Fn() {}
var fn = new Fn()
console.log(Fn.prototype, fn.__proto__)//object object
console.log(Fn.prototype===fn.__proto__)//true
- 显式原型与隐式原型的关系
- 函数的prototype: 定义函数时被自动赋值, 值默认为{}, 即用为原型对象
- 实例对象的__ proto__: 在创建实例对象时被自动添加, 并赋值为构造函数的prototype值
- 原型对象即为当前实例对象的父对象

原型链(隐式原型链)
- 原型链是由一些对象通过其内部的 [[Prototype]] 属性相互关联而形成的一条链路。这条链路用于解析属性:当读取对象的某个属性时,如果该对象自身没有此属性,则会沿着这条链向上寻找,直到找到该属性或到达链的末端。
- 每当创建一个新的函数,JS引擎会为这个函数添加一个 prototype 属性,指向一个对象。当用这个函数作为构造函数来创建新的对象实例时,这些实例的 [[Prototype]] 将自动指向构造函数的 prototype。这样就形成了一个链,允许属性和方法的继承。所有的实例对象都有__ proto__属性, 它指向的就是原型对象

- 函数的显示原型指向的对象默认是空object实例对象(但object除外)
- console.log(Object.prototype instanceof Object)//false
- 所有函数都是Function的实例(包含Function)
- console.log(Function.proto===Function.prototype)//false
- Object的原型对象是原型链的尽头
- instanceof
- 表达式: A instanceof B
- 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false

function Foo() { }
var f1 = new Foo();
console.log(f1 instanceof Foo);//true
console.log(f1 instanceof Object);//true

console.log(Object instanceof Function)//true
console.log(Object instanceof Object)//true
console.log(Function instanceof Object)//true
console.log(Function instanceof Function)//true
function Foo() {}
console.log(Object instanceof Foo);//false
- 典例:
var A = function() {}
A.prototype.n = 1var b = new A()A.prototype = {n: 2,m: 3
}var c = new A()
console.log(b.n, b.m, c.n, c.m)//1 undefined 2 3

var F = function () { };
Object.prototype.a = function () {console.log('a()')
};
Function.prototype.b = function () {console.log('b()')
};
var f = new F();
f.a()//a()
f.b()//报错 原型链找不到
F.a()//a()
F.b()//b()
相关文章:
JavaScript--原型与原型链
在JavaScript中,原型(prototype)是一个非常重要且独特的概念,它在对象创建和继承方面发挥着关键作用。理解原型及其相关的机制有助于更好地理解JavaScript的对象模型,以及如何设计和使用对象和继承。 JavaScript–原型…...
hive—常用的日期函数
目录 1、current_date 当前日期 2、now() 或 current_timestamp() 当前时间 3、datediff(endDate, startDate) 计算日期相差天数 4、months_between(endDate, startDate) 日期相差月数 5、date_add(startDate, numDays) 日期加N天 6、date_sub(startDate, numDays) 日期减…...
HTML零基础入门教学
目录 一. HTML语言 二. HTML结构 三. HTML文件基本结构 四. 准备开发环境 五. 快速生成代码框架 六. HTML常见标签 6.1 注释标签 6.2 标题标签:h1-h6 6.3 段落标签:p 6.4 换行标签:br 6.5 格式化标签 6.6 图片标签&a…...
vue3 父组件调用子组件 el-drawer 抽屉
之前 Vue3 只停留在理论,现在项目重构,刚好可以系统的实战一下,下面是封装了一个抽屉表单组件,直接在父组件中通过调用子组件的方法打开抽屉: 父组件: <template><div id"app"><…...
Java中常用算法之选择排序算法
一.选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理是每次从未排序部分选择最小(或最大)的元素,并将其放到已排序部分的末尾。以下是用Java实现选择排序的代码及其详细讲解。 二.选择排序代码 publ…...
UNIX简史
从1991年Linux出现至今,由于众多IT巨头以及技术社区的推动,Linux已经成为非常成熟、可用于各种关键领域的操作系统,适当了解其发展历史,对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…...
React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法
React 在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件…...
uniapp 常用的指令语句
uniapp 是一个使用 Vue.js 开发的跨平台应用框架,因此,它继承了 Vue.js 的大部分指令。以下是一些在 uniapp 中常用的 Vue 指令语句及其用途: v-if / v-else-if / v-else 条件渲染。v-if 有条件地渲染元素,v-else-if 和 v-else 用…...
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
【1】引言 前序已经对BGR图像和HSV图像的转换进行了基本讨论,相关文章链接为: python学opencv|读取图像(十二)BGR图像转HSV图像-CSDN博客 python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入-C…...
C# 结构体和类
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、类(Class)二、结构体(Struct)示例代码(定义类和结构体)类的继承代码示例(…...
D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。
概述: D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点: ● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电压(2.5V) ● 超过工作范围能进行自动校…...
题目 1738: 排序
题目 1738: 排序 时间限制: 2s 内存限制: 96MB 提交: 14351 解决: 3477 题目描述 对输入的n个数进行排序并输出。 输入格式 输入的第一行包括一个整数n(1<n<100)。 接下来的一行包括n个整数。 输出格式 可能有多组测试数据,对于每组数据,将排序后…...
爬虫逆向学习(十四):分享一下某数通用破解服务开发经验
阅前须知 这篇博客不是教大家怎么实现的,而且告知大家有这个东西,或者说一种趋势,借此分享自己大致的实现经验。具体的实现我也不好整理,毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道࿰…...
《Vue进阶教程》第十一课:响应式系统介绍
1 什么是响应式 当数据改变时, 引用数据的函数会自动重新执行 2 手动完成响应过程 首先, 明确一个概念: 响应式是一个过程, 这个过程存在两个参与者: 一方触发, 另一方响应 比如说, 我们家小胖有时候不乖, 我会打他, 他会哭. 这里我就是触发者, 小胖就是响应者 同样, 所谓…...
rpc设计的再次思考20251215(以xdb为核心构建游戏框架)
1.服务提供者注册的方式 // 表明这是一个服务提供者,ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时,才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...
pydub AudioSegment增加音频文件音量并保存- python 实现
DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加中。 需要更多数据资源和技术解决方案,知识星球: “DataBall - X 数据球(free)” -------------------------------------------------------------…...
IT 新突破!远程控制电脑技术造就工作与学习新方向!
远程控制电脑技术的历史可追溯到计算机网络的早期时代。最初,通过电话线和调制解调器的组合,实现了远程访问,这是远程控制电脑技术的雏形。随着互联网技术的飞速发展,远程控制电脑技术也日趋完善,并在多个领域得到了广…...
LabVIEW起落架震台检测
在现代飞机制造与维护过程中,起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统,通过模拟飞机着陆过程,准确捕捉起落架在着陆时承受的各种动力学特性和应力响应,有效提升起落架设计的精度与可靠…...
Day24 C++ 接口(抽象类)
C 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现。 C 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明…...
UE5 关于画质、机能与开发成本的思考
1、并不省时间 UE5等工具优点是可以通过一些工具与资源快速获得较好的画面,节约一些时间, 但缺点也很多, 一个是各种精度的素材之间的协调问题,参差不齐,统一升级到高精度会产生较大的成本, 一个是资源…...
如何快速掌握Subtitle Edit:新手也能上手的完整实战指南
如何快速掌握Subtitle Edit:新手也能上手的完整实战指南 【免费下载链接】subtitleedit the subtitle editor :) 项目地址: https://gitcode.com/gh_mirrors/su/subtitleedit 你是不是经常遇到下载的字幕与视频不同步?或者想要为自制视频添加专业…...
WPS Zotero插件冲突解决方案
WPS Zotero插件冲突解决方案 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 在使用WPS进行文献管理时,你是否遇到过Zotero插件功能异常的情况?本文将…...
MATLAB导纳控制仿真入门:从零开始搭建单自由度模型(附完整代码)
MATLAB导纳控制仿真入门:从零开始搭建单自由度模型(附完整代码) 导纳控制作为机器人柔顺控制的核心算法之一,在医疗机器人、协作机器人等领域有着广泛应用。想象一下外科手术机器人需要精准感知医生操作力并做出柔顺响应ÿ…...
3个核心技巧:PS手柄无缝适配PC完全指南
3个核心技巧:PS手柄无缝适配PC完全指南 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 对于拥有PS4/PS5手柄的玩家而言,在PC上实现完美适配一直是提升游戏体验的关…...
Oracle 12c安装实战:解决PRVG-0449堆栈软限制配置难题
1. 初识PRVG-0449错误:堆栈软限制的"拦路虎" 第一次在Oracle 12c安装过程中遇到PRVG-0449错误时,我盯着屏幕上的红色警告愣了好几秒。错误信息明确告诉我:"Proper soft limit for maximum stack size was not found"&…...
【Java等保三级最小可行合规方案】:从Spring Boot 2.7到3.2,仅需修改8处配置+3个注解
第一章:Java等保三级合规的底层逻辑与演进脉络等保三级(GB/T 22239-2019《信息安全技术 网络安全等级保护基本要求》)对Java应用系统提出了覆盖“安全物理环境、安全通信网络、安全区域边界、安全计算环境、安全管理中心”五大层面的强制性约…...
【IEEE TNNLS 2025】赋予大模型“跨院行医”的能力:基于全局与局部提示的医学图像泛化框架 (GLP) 解析
在医学图像分割的临床落地中,一个长期存在的痛点是**“领域偏移 (Domain Shift)”**。一个在A医院(源域)表现完美的深度学习模型,当部署到使用不同成像设备、不同扫描参数的B医院(未知目标域)时,…...
你那点芯片技术,撑不过35岁
很多搞芯片的人,30岁左右会有一段很舒服的时光。RTL写得顺手,时序约束能搞定,综合流程跑起来没问题,偶尔能查出几个难定位的bug,感觉自己挺能打的。但大概从32、33岁开始,一些很微妙的事情发生了。项目变复…...
QMCDecode:3分钟快速解锁QQ音乐加密文件,实现跨平台音乐自由
QMCDecode:3分钟快速解锁QQ音乐加密文件,实现跨平台音乐自由 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录…...
【通信】基于matlab MC-CDMA系统仿真【含Matlab源码 15245期】
💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞Ὁ…...
