深入浅出JavaScript原型与原型链

【JavaScript】深入浅出JavaScript继承机制:解密原型、原型链与面向对象实战攻略 本文全面解析了JavaScript中的继承机制,核心围绕原型链这一核心概念展开,阐述了其在对象继承中的作用与重要性,并介绍了几种主要的继承实现方式。以下是文章内容的概括:📌原型基础每个JavaScript对象都隐含一个属性,通常通过__proto__访问,指向创建它的构造函数的prototype对象。构造函数的prototype本身是个对象,包含可被实例共享的方法和属性。示例展示了如何通过原型链,实例能访问到构造函数原型上的方法。📌原型链的形成与查找规则。 阅读详情

js中的原型与原型链应该是老生常谈的话题了,在前端面试中基本都是必问的一个问题,但是很多人还是稀里糊涂的,只知道其表层含义,一但面试官问深一点就支支吾吾了(我自己)。为了自己下次能在面试中"装b",肝了一夜,特此记录一下,加深印象,也希望能帮到有需要的小伙伴。

先来看一张图↓

相信第一眼看到这个图的人,都觉得很繁琐,不想看了,其实你耐心的看完这篇文章就会觉得不过如此。这种图真的特别有用、特别有用、特别有用,重要的事情说三遍,那我们开始吧。

构造函数创建对象

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

function Person() {

}
var person = new Person();
person.name = 'Kevin';
console.log(person.name) // Kevin

这个例子就是用Person构造函数new了一个实例对象person,这个就不用多说了吧。

prototype

每个函数都有一个prototype属性,不信的话,你可以随便找个函数,打开F12都能看到。(注意:prototype是函数特有的属性)

function Person() {

}
// 虽然写在注释里,但是你要注意:
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

那这个函数的 prototype 属性到底指向的是什么呢?是这个函数的原型吗?

其实,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 person1 和 person2 的原型。那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。让我们用一张图表示构造函数和实例原型之间的关系:

在这张图中我们用Person.prototype表示实例原型。

那么我们该怎么表示实例与实例原型,也就是 person 和 Person.prototype 之间的关系呢,这时候我们就要讲到第二个属性:

__proto__

为了证明每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型这句话的真实性,我们可以用个例子来证实。

function Person() {

}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true

既然这样,我们来更新一下关系图:

既然实例对象和构造函数都可以指向原型,那原型中是否有属性可以指向实例或者说是构造函数呢?

首先我们可以排除原型是没有属性指向实例的,因为一个构造函数可以new多个实例。

constructor

主要是讲下原型中的constructor,每个原型都有一个constructor属性指向构造函数。老规矩,可以在浏览器验证一下。

function Person() {

}
console.log(Person === Person.prototype.constructor); // true

得到下面的关系图:

从上面的关系图以及举的例子,我们来梳理总结一下:

function Person() {

}

var person = new Person();

console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true

了解完了构造函数、实例、实例原型之间的关系,我们来讲下实例与原型是怎么样一个关系呢?

实例与原型

当读取上面的实例的属性,找不到的时候,会发生什么呢?如果找不到的话,就会查找与实例相关联的原型的属性中查找,如果还是找不到就会去原型的原型中查找,一直找到最顶层为止。

function Person() {

}

Person.prototype.name = 'Kevin';

var person = new Person();

person.name = 'Daisy';
console.log(person.name) // Daisy

delete person.name;
console.log(person.name) // Kevin

在这个例子中,我们给实例对象 person 添加了 name 属性,当我们打印 person.name 的时候,结果自然为 Daisy。

但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person.__proto__ ,也就是 Person.prototype中查找,幸运的是我们找到了 name 属性,结果为 Kevin。

但是万一还没有找到呢?原型的原型又是什么呢?

其实原型对象就是通过 Object 构造函数生成的,结合之前所讲,实例的 __proto__ 指向构造函数的 prototype ,所以我们再更新下关系图:

原型链

那 Object.prototype 的原型呢?null,我们可以打印:

console.log(Object.prototype.__proto__ === null) // true

所以Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

所以查找属性的时候查到 Object.prototype 就可以停止查找了。

到此就分析完了,蓝色的这条线其实就是原型链。

总结

这里有几个点需要注意一下:

constructor

首先是 constructor 属性,我们看个例子:

function Person() {

}
var person = new Person();
console.log(person.constructor === Person); // true

当获取 person.constructor 时,其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时,会从 person 的原型也就是 Person.prototype 中读取,正好原型中有该属性,所以:

person.constructor === Person.prototype.constructor

_proto_

其次是 __proto__ ,绝大部分浏览器都支持这个非标准的方法访问原型,然而它并不存在于 Person.prototype 中,实际上,它是来自于 Object.prototype ,与其说是一个属性,不如说是一个 getter/setter,当使用 obj.__proto__ 时,可以理解成返回了 Object.getPrototypeOf(obj)。

AS7341光谱传感器实战:I2C驱动、Arduino与Python代码及校准指南 光谱传感器通过多通道滤光片与光电二极管阵列,将光信号转换为数字量,实现波长级测量。其技术价值在于以低成本替代传统光谱仪,完成颜色识别、光源分析等任务。在植物补光、水质检测等场景中,多通道光谱数据能精准区分红光与深红光比例。AS7341作为9通道(8可见光+1近红外)I2C传感器,支持Arduino、ESP32和树莓派,结合增益与积分时间调节,可适应强弱光环境。本文从芯片原理出发,详解寄存器配置、双平台代码实现、暗电流与白板校准方法,并给出常见问题排查指南,帮助创客快速构建光谱应用。 阅读详情

相关推荐

晶圆表面缺陷检测现状概述

凹坑,凸起,尖角,沟槽),使用光束对晶圆进行照射,收集反射光和散射光信息进行缺陷判断,进一步可分为无图案晶圆表面检测和宏观缺陷检测设备。KLA使用SR-DUV光,检测精度在10nm以下。扫描电子显微(电子束和晶圆表面产生二次电子,X射线等)获取高分辨率的图像,然后用图像处理表面缺陷(凹坑,凸起,尖角,沟槽等)表面容貌和材料信息,分辨率可达5-10nm。晶圆表面缺陷检测设备主要检测晶圆外观呈现出来的缺陷,损伤、毛刺等缺陷,主要设备供应商KLA,AMAT,日立等,其中KLA在晶圆表面检测设备占有市场52%左右。

qq_36786800的博客 1万+

JavaScript深入浅出了解原型与原型链

一图了解原型链 1. 什么是原型? 原型分为两种 显示原型 prototype 和 隐示原型__proto__。 在js中所有函数基本上都有 prototype这个属性,属性值是一个普通的对象。 在js中所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象。 有一个例外 let fun = Function.prototype.bind() 此时fun没有原型。 所有引用类型的__proto__属性指向它构造函数的显示原型prototype 函数原型中有一个属性con

weixin_45174208的博客 334

MT6816角度传感器SPI通信避坑指南:从数据手册到稳定读取的3个关键步骤

本文详细解析了MT6816角度传感器SPI通信中的常见问题与解决方案,包括寄存器地址计算、SPI时序配置和数据校验等关键步骤。通过实测波形和代码示例,帮助工程师避开数据手册中的隐藏陷阱,实现稳定可靠的角度数据读取,特别适用于高精度电机控制场景。

weixin_42520573的博客 516

一篇文章彻底搞懂原型和原型链(图解+代码)

JavaScript 规定,每一个构造函数都有一个 prototype(原型) 属性,指向另一个对象,所以我们也称为原型对象,构造函数通过原型分配的函数是所有对象所共享的。

有事儿私信。 1947

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2284

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1814

原型及原型链详解

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。这就是所谓的原型链的基本概念。——摘自《javascript高级程序设计》

dyy_csdn的博客 3万+

【学习系列】SAP RAP 18:Unmanaged场景开发示例-基本数据更新

本文介绍了在SAP RAP中unmanaged模式下从0到1的开发步骤。unmanaged模式下需要自行实现数据更新、权限检查等逻辑,适用于操作现有数据库表或复杂业务场景。文章以两层的采购订单对象为例,详细说明了创建技术对象(表、视图、行为定义等)的过程,并重点阐述了如何实现CRUD相关方法的核心逻辑。通过创建缓冲类来处理交互阶段和保存阶段的数据操作,确保事务一致性。完整代码展示了抬头层级的增删改查功能实现,为后续明细层级的开发奠定了基础。

DeveloperMrMeng的博客 637

深入浅出理解JavaScript原型与原型链

原型链概念如大家族:对象是家族成员个体,[[Prototype]]是子女指向父母的链接,原型链是依此形成的向上祖谱线(子女→父→爷...),查找属性/方法就像找技能:自己如果不具备则向上问(父、爷...),直到Object.prototype(祖先)或null终点,自身的属性优先于原型属性(覆盖)。

m0_50296683的博客 1287

使用 MATLAB/Simulink 搭建一个 无人机群间数据交换与协同控制仿真系统

本文提供了一份详细的Simulink无人机群协同控制仿真教程。主要内容包括:无人机群系统架构设计(去中心化网络、通信分层)、三维运动建模、空-空通信链路实现(距离判断、无线信道)、分布式Consensus控制算法开发,以及性能评估指标设定。教程采用模块化设计思路,通过ModelReference构建多无人机并行模型,并给出了MATLAB函数实现关键算法。最后展示了预期仿真结果(收敛时间<15s、位置偏差<2m)和进阶应用方向(编队飞行、AI协同等),帮助读者掌握群体智能系统的建模与仿真方法。

amy_mhd的博客 155

27、视网膜血管识别与分类的数据集和验证过程

本文介绍了视网膜血管自动识别与分类方法所使用的数据集及其验证过程。通过30张高分辨率的近红外反射视网膜图像,结合专业医生的手动标注结果,构建了包含597个血管段的基准数据集。研究采用准确率、召回率、F1分数和混淆矩阵等评估指标对模型进行验证,并提出了特征增强和分类器优化策略以提升性能。实验结果显示,该方法在复杂区域具有较强的鲁棒性和较高的准确性,为临床应用提供了可靠的依据。

i7j8k9l的博客 148

深入浅出JavaScript原型链:从入门到精通

想象一下,你在制作一个家族族谱。每个家庭成员都有自己的特点,但他们也共享家族的某些特征,比如姓氏、家族传统等。在JavaScript中,对象之间的关系就像家族成员之间的关系一样,通过原型链相互连接,实现属性的继承和共享。每个JavaScript对象(除了null)都有一个原型(prototype),原型也是一个对象。对象可以从原型中继承属性和方法。这种一层层追溯原型的过程,就形成了原型链。原型链是JavaScript中实现对象继承和属性共享的重要机制。

2301_76632476的博客 2015

1.DJI-payload SDK负载开发准备和硬件连接及运行示例代码

大疆psdk开发环境

哒宰的博客 1441

深入浅出理解javaScript原型链

深入浅出理解javaScript原型链 作者:nicholaszjb 字体:[增加 减小] 类型:转载 时间:2015-05-09 我要评论 这篇文章主要介绍了对javaScript原型链的理解,以实例形式对javaScript原型链的概念及相关使用技巧做了较为浅显易懂的分析,需要的朋友可以参考下 本文实例讲述了javaScript的原型链。分享给大家供大

jfkidear的专栏 379

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

深入浅出,JS原型链的工作原理

深入浅出,JS原型链的工作原理 前言:原型链,即原型链条。它是由原型、原型的原型、原型的原型的原型...这一规则组合成的,经常被应用于继承。 原型的作用在JS中,每个对象都有自己的原型。当我们访问对象的属性和方法时,JS会先访问对象本身的属性和方法。如果对象本身不包含这些属性和方法,则访问对象对应的原型。 function Person(nam...

w1366352655的博客 213

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

js深入浅出系列之原型和原型链

本文旨在帮助自己也同样帮助大家梳理S一系列知识,本文主要讲如原型、继承、作用域等知识。 1.JS原型和原型链 首先我们先来使用构造函数new一个对象: function Person() { } var male=new Person(); male.name='zhangsan' 比如,在这个例子中,Person就是一个构造函数,我们使用new来创建了一个Person的实例对象male。 prototype 每个函数都会有prototype属性(箭头函数没有哦!),比如 function Person(

weixin_45683908的博客 201

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入浅出的理解js的原型链

深入浅出的理解js的原型链

qq_42938889的博客 272

深入浅出 JavaScript 原型链

追求进步的同学都关注了“1024译站”这是1024译站的第 32篇文章了解原型链继承的概念这篇文章,我们来学习一下 JavaScript 原型链。我们将了解对象之间是怎么关联的...

奇舞周刊 247

【JavaScript】原型对象 => 原型链的深入浅出解读

JS 的原型对象你了解吗?何又被称为原型链?本文将带你深入浅出的理解它并运用它。

如果巅峰留不住,那就重走来时路! 1158

深入浅出彻底理清js中的原型链

什么是js原型链? 原型链可以理解为嵌套多层的对象。在js代码中很多方法是可以复用的,如果每次都引用就会增加很多成本,于是js就给对象默认增加了一个内部属性"__proto__",通过这个属性就可以将原本独立的方法(原型)链接起来。当调用某个方法或属性就会去原型上去找,原型找不到就去原型的原型上找,直到最后没有就返回undefined。

rni88的博客 888

深入浅出JavaScript之原型链&继承

深入浅出JavaScript之原型链&继承 转载于:https://www.cnblogs.com/lichaoqing/p/5939877.html

weixin_34356138的博客 64

浅谈js原型和原型链

一、简述 对于javascript 对象(函数) 原型和原型链的理解,其实不那么难,简单来说,需要理解什么是原型,怎么访问原型,什么是原型链,怎么通过原型链去访问原型,就可以大概理清楚原型和原型链的基础知识。 二、浅析 1、何为原型 在js引擎启动的时候,其内核就生成了最基本的Object和Function的原型内容,也就是最原始最自然的代码。 (1)Object的原型是一个对象变量,该对象变量存...

hao255的博客 1312

深入浅出理解JS原型链继承

引出 js在ES6以前还没有class的概念,但却存在着面向对象的思想。在js中,可通过构造函数的形式来创建对象,并使用各种方式实现继承,其中原型链继承便是一种普遍的方法 什么是原型链继承 先来看一个例子 function Parent () { this.type = 'obj' } function Child () { this.name = 'zs', this.age =...

m0_37782372的博客 356

深入浅出JavaScript 原型链:对象继承的“隐形链条”

在 JavaScript 的世界里,**原型链**(Prototype Chain)是一个核心概念。它如同一条隐形的链条,连接着所有对象,使得代码能够高效地共享属性和方法。理解原型链,不仅能帮助你写出更优雅的代码,还能让你在调试时快速定位问题。

JakeMa1024的博客 528

javascript深入浅出——原型&原型链

原型 原型是js中实现继承的过程中产生的一个概念 继承:指在一个对象的基础上创建新对象的过程,原型指在这过程中作为基础的对象。 创建对象 var o = { f:function(){ return this.a+this.b; } } var p = Object.create(o); p.a=1; p.b=2; console.log(p.f(

天空影 914
上一篇: 如何避免 JavaScript 中的内存泄漏?
下一篇: Java多线程专题之线程与进程概述
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值