JavaScript 原型链

news2025/1/20 17:03:28

文章目录

  • 原型链
    • 本质 - 对象间的关联关系
    • instanceof 和 isPrototypeOf
    • __proto__的大致实现
    • 委托

原型链

原型链就是一系列对象的链接。通常来说,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就会继续在[[Prototype]]关联的对象上进行查找。同理,如果在后者中也没有找到需要的引用,就会继续查找它的[[Prototype]],以此类推。([[Prototype]]机制就是存在于对象中的一个内部链接,它会引用其它对象) ——参考《你不知道的JavaScript》上卷

本质 - 对象间的关联关系

原型链示例
图/原型链示例
function Car() {};
let car1 = new Car();
let car2 = new Car();
let o1 = {};

// 原型链的查找终点
Object.prototype.__proto__ === null

// Object 的 [[Prototype]] 指向 Function.prototype,因此 typeof Object 的输出结果为 'function'
Object.__proto__ === Function.prototype
typeof Object // ’function‘

// Function 的 prototype 和 [[Prototype]] 都指向 Function 的原型
Function.prototype === Function.__proto__

// 函数的原型的 [[Prototype]] 指向 Object 的原型
Function.prototype.__proto__ === Object.prototype
Car.prototype.__proto__ === Object.prototype

// new 出来的实例的 [[Prototype]] 指向其构造函数的原型
car1.__proto__ === Car.prototype
car2.__proto__ === Car.prototype
car1.__proto__ === car2.__proto__

// 对象的 [[Prototype]] 指向 Object 的原型
o1.__proto__ === Object.prototype

instanceof 和 isPrototypeOf

  • instanceof 操作符用于测试构造函数的原型是否出现在一个对象的原型链中,注意:语法是 object instanceof constructor
let o1 = {};
o1 instanceof Object // true, 因为 o1.__proto__ === Object.prototype

let a = {};
let b = Object.create{a};
b instanceof a // Uncaught TypeError: Right-hand side of 'instanceof' is not callable,因为a不是构造函数

Object instanceof Function // true, 因为 Object.__proto__ === Function.prototype
Object instanceof Object // true, 因为 Object.__proto__.__proto__ === Object.prototype
  • isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象的原型链上
let a = {};
let b = Object.create{a};

Object.isPrototypeOf(a); // false, 因为 Object 不在对象 a 的原型链上
Object.prototype.isPrototypeOf(a); // true,因为 Object.prototype 在对象 a 的原型链上

a.isPrototypeOf(b); // true, 因为 b.__proto__ === a

__proto__的大致实现

__proto__ 存在于 Object.prototype 中,__proto__看起来很像一个属性,但是实际上它更像一个 getter/setter。

// __proto__的实现大致上是这样的
Object.defineProperty(Object.prototype, "__proto__", {
	get: function() {
        return Object.getPrototypeOf(this);
    },
    set: function(o) {
        Object.setPrototypeOf(this, o);
		return o;
    }
});

委托

带new的函数调用通常被称为“构造函数调用”,尽管实际上它们和传统面向类语言中的类构造函数不一样。虽然 JavaScript 中的机制和传统面向类语言中的“类初始化”和“类集成”很相似,但是 JavaScript 中的机制有一个核心区别,那就是不会复制,对象之间是通过内部的 [[Prototype]] 链关联的。

出于各种原因, 以“继承” 结尾的术语(包括“原型继承”) 和其他面向对象的术语都无法帮助你理解 JavaScript 的真实机制(不仅仅是限制我们的思维模式)。相比之下, “委托” 是一个更合适的术语, 因为对象之间的关系不是复制而是委托。

委托行为意味着某些对象在找不到属性或者方法引用时会把这个请求委托给另一个对象。
仅仅是限制我们的思维模式`)。相比之下, “委托” 是一个更合适的术语, 因为对象之间的关系不是复制而是委托。

委托行为意味着某些对象在找不到属性或者方法引用时会把这个请求委托给另一个对象。

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

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

相关文章

餐饮业数字化提速,OceanBase助海底捞变身“云上捞”

在海底捞火锅智慧餐厅,你会看到忙得团团转的机械臂和传菜机器人,顾客在智能点餐系统上下单,机械臂和传菜机器人就会着手备菜、传菜、上菜,服务人员则有更多时间专心应答顾客的各种询问。这种新模式,也为海底捞家喻户晓…

Springboot新手开发 基本总结

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…

网络实验之HSRP协议

一、HSRP协议简介 HSRP:热备份路由器协议(HSRP:Hot Standby Router Protocol),是cisco平台一种特有的技术,是cisco的私有协议。该协议中含有多台路由器,对应一个HSRP组。该组中只有一个路由器承…

mac自定义环境变量,mac自定义python变量,自定义通用变量(任意名字)

文章目录几个常用的命令工作原理知道原理后已经有了环境变量没有该环境变量几个常用的命令 功能命令查看当前环境变量echo $PATH编辑文件(注:这里是直接编辑bash_profile)vi ~/.bash_profile编辑i退出编辑esc回到命令(用命令来保…

Apollo实现cron语句的热配置

GitHub项目地址 Gitee项目地址 Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适…

stl algorithms 算法

所有泛型算法,除了少数例外,前两个参数均为一组iterator,用来标识欲遍历容器元素的范围,范围从第一个iterator所指位置开始,至第二个iterator所指位置(并不包括)结束 如 int arr[3]{1,2,3} ve…

管理客户信息并非易事

客户信息是企业的重要资产,是企业日积累月的价值沉淀,管理客户信息对于企业来说并不是一件容易的事,只有妥善管理客户信息,才能为企业创造更多价值。前言众所周知,客户信息是企业的重要资产,是企业日积累月…

rtu遥测终端机应用及安装介绍

1、设备介绍 设备集遥测终端机功能和视频录像机功能为一体,融合先进的3G/4G/WIFI通信技术、实现水文/水资源/环保212/TCP Modbus/MQTT等数据的采集、视频、图像存储、显示、控制、报警及传输等智能值守功能。 2、设备应用方向 本设备可广泛适用于带视频监测的水…

Jenkins 构建过程中提示 GPG 错误

错误信息如下:[INFO] --- maven-gpg-plugin:3.0.1:sign (sign-artifacts) rets-io --- gpg: no default secret key: No secret keygpg: signing failed: No secret key这个问题的原因应该是我们最近把我们的项目发布到中央 Maven 仓库中,但是发布项目到…

社区发现系列05:图的构建

想要挖掘作弊团伙首先先要构建社交网络图,然后用算法或者策略挖掘作弊团伙,那么如何构建社交网络图呢?下面给大家介绍一些实战经验,主要从电商和互金小额贷款两个业务场景来说: 1、电商业务 由于电商业务涉及的业务场…

《Spring揭秘》读书笔记1:IoC和AOP

1 Spring框架的由来 Spring框架的本质:提供各种服务,以帮助我们简化基于POJO的Java应用程序开发。 各种服务实现被划分到了多个相互独立却又相互依赖的模块当中: Core核心模块:IoC容器、Framework工具类。 AOP模块:S…

万物皆可灵活用工?灵活用工模式最契合的行业是哪些?

灵活用工VS传统用工 1)传统用工 企业与员工签订劳动合同,双方出现问题纠纷适用于劳动法,关系固定,企业责任大。养着你,难,辞了你,更难。企业成本相对较高、负担较重(薪资、福利&am…

Hudi的核心概念 —— 表类型(Table Types)

文章目录Copy On WriteMerge On ReadCOW 与 MOR 的对比查询类型(Query Types)Snapshot QueriesIncremental QueriesRead Optimized Queries不同表支持的查询类型Copy On Write 在 COW 表中,只有数据文件/基本文件(.parquet&#…

【Java寒假打卡】Java基础-集合HashSet

【Java寒假打卡】Java基础-集合Set概述哈希值hashSet原理HashSet存储学生对象并遍历小结概述 底层数据结构是哈希表不能保证存储和去除的顺序完全一致没有带索引的方法,所以不能使用普通的for循环进行遍历 使用增强for循环或者迭代器进行遍历由于是Set集合&#xf…

广告业务系统 之 承前启后 —— “消息中心”

文章目录广告业务系统 之 承前启后 —— “消息中心”消息中心物料同步链路图模块设计之 “一分为二”模块交互图之 “强一致性设计”奇怪交互图的数据链路数据一致性问题日志中心广告业务系统 之 承前启后 —— “消息中心” 消息中心 消息中心,是为 投放引擎 做…

韩顺平老师的Linux基础学习笔记 (上)

Linux学习笔记 前言:本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成,希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获! 目录: 韩顺平老师的Linux基础学习笔记 (上)韩顺平老师的Linu…

交通部互通互联二维码之发卡机构公钥证书

背景 随话说的好啊,好比不如烂笔头,之前开发联调OK后,闲置了半年,结果今天再去搞公钥,发现完全忘记了生成规则。审核 有病 哪里来的广告? 特此,记录一下我们的过程,以便后面再出现…

gitee的ssh配置

#1.配置自己的gitee郵箱,返回直接輸入郵箱 ssh-keygen -t rsa -C "郵箱" #2.複製郵箱的ssh秘鑰 cat ~/.ssh/id_rsa.pub #在個人配置添加自己的ssh秘鑰

【jQuery】常用API——jQuery样式

jQuery 给我们封装了很多动画效果,最为常见的如下:一、显示隐藏切换效果1. 显示语法规范 show([speed,[easing],[fn]]);显示参数:(1)参数都可以省略, 无动画直接显示。(2)speed&…

(十五)一篇文章搞懂Java的内部类

目录 1.概述: 2.内部类之一:静态内部类 3.内部类之二:成员内部类 4.内部类之三:局部内部类 5.内部类之四:匿名内部类 1.概述: 内部类就是定义在一个类里面的类,里面的类可以理解成(寄生)。 2.内部类的使用场景、作用: ①当一个事务的内部,还…