当前位置: 首页 > news >正文

【JavaScript】深度剖析prototype与__proto__到底是什么以及他们的关系

一个对象的 __proto__ 指向的是这个对象的构造函数的 prototype

prototype 是什么

prototype函数的属性,是一个继承自 Object 的对象,默认的 prototype 只有一个属性,其中包含 constructor,指向当前函数自身。

Ctor.prototype = Object.create(Object.prototype, {constructor: { value: Ctor },
});

一个 Function 对象在使用 new 运算符来作为构造函数时,会将它的 prototype 属性作为新对象的原型。

function Ctor() {}
const inst = new Ctor();Ctor.prototype === Object.getPrototypeOf(inst); // true
Ctor.prototype === inst.__proto__; // true

__proto__ 是什么

__proto__对象的属性,是对象的原型对象,如果在对象上没有找到某个属性则会沿着对象的原型链查询,所有的对象都继承自 Object

普通对象的 __proto__ 属性是对象,函数的 __proto__ 是一个内置函数。

创建一个对象时会给这个对象一个 __proto__ 属性,指向其构造函数的 prototype 属性。

function Ctor() {}
const inst = new Ctor();inst.__proto__ === Ctor.prototype; // true
inst.__proto__.constructor === Ctor; // true
inst.constructor === Ctor; // true
inst.hasOwnProperty("constructor"); // false constructor 是 inst.__proto__ 上的属性

未用 new 操作符创建的对象默认构造函数为 Object

const obj = {};obj.constructor === Object; // true

函数的独特之处

JavaScript 中万物皆为对象,函数也是一种特殊的对象,所有的函数都继承自 Function

function Ctor() {}Ctor.__proto__ === Function.prototype; // true

关于 Function

  • Function.constructor 指向 Function 自身。
  • Function.prototype 是一个函数。
Function.constructor === Function; // true
Function.prototype; // ƒ () { [native code] }
Function.prototype.__proto__ === Object.prototype; // true

需要注意的是,函数继承自 Function,但是用函数作为构造函数创建出的实例对象是继承自 Object 的。

function Ctor() {}
const inst = new Ctor();Object.prototype.tag = "obj";console.log(Function.tag); // obj
console.log(Ctor.tag); // obj
console.log(inst.tag); // objFunction.prototype.tag = "func";
console.log(Function.tag); // func
console.log(Ctor.tag); // func
console.log(inst.tag); // objCtor.prototype.tag = "ctor";
console.log(Function.tag); // func
console.log(Ctor.tag); // func
console.log(inst.tag); // ctor

Q&A

Ctor.prototype 是什么

函数的 prototype 是一个继承自 Object 的对象,默认的 prototype 只有一个属性,其中包含 constructor,指向当前函数自身,可以这样定义:

Ctor.prototype = Object.create(Object.prototype, {constructor: { value: Ctor },
});

Ctor.__proto__ 是什么

js 中的函数也是一种对象,函数对象的构造函数是 Function对象的原型指向其构造函数的 prototype,因此函数的 __proto__ 属性指向 Function.prototype

注意 Function.prototype 是一个内置函数。

function Ctor() {}
Ctor.__proto__ === Function.prototype; // true
Function.prototype; // ƒ () { [native code] }

Ctor.prototype.__proto__ 指向什么

所有对象的默认构造函数都是 ObjectCtor.prototype 的原型就是其构造函数的 prototypeObject.prototype

function Ctor() {}
Ctor.prototype.__proto__ === Object.prototype;

为什么 Function.prototype 是函数

之前说过函数的 prototype 是对象,但是 Function.prototype 却是一个函数,在 ECMAScript® 2015 Language Specification中描述了这样做的原因:

NOTEThe Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification。

注:Function 原型对象被指定为函数对象,以确保与 ECMAScript 2015 规范之前创建的 ECMAScript 代码兼容。

Function 原型对象本身就是一个内置函数对象。当被调用时,它接受任何参数并返回 undefined。它没有[[Construct]]内部方法,因此它不是构造函数。

参考

MDN Object.prototype.__proto__

ECMAScript® 2015 Language Specification

相关文章:

【JavaScript】深度剖析prototype与__proto__到底是什么以及他们的关系

一个对象的 __proto__ 指向的是这个对象的构造函数的 prototype。 prototype 是什么 prototype 是函数的属性,是一个继承自 Object 的对象,默认的 prototype 只有一个属性,其中包含 constructor,指向当前函数自身。 Ctor.proto…...

css选择器

目录1、基本选择器(1)id选择器(2)类选择器(3)标签选择器(4)逗号选择器(5)*选择器(通配符选择器)2、包含选择器(1&#xff…...

MyBatis详解2——增删改查操作

一、SpringBoot单元测试 1.1什么是单元测试 单元测试是指对软件中的最小测试单元进行检查和验证的过程。 执行单元测试就是为了证明某段代码的执行结果是否符合我们的预期。如果测试通过则是符合预期,否则测试失败。 1.2单元测试的好处 1.单元测试不用启动Tomca…...

最大连续子列和

给定一个数组,求它的最大连续子列和。这个问题有四种解法。 1、暴力循环(O(n^3))分析这个问题,既然是子列,那么它最长为n,最短为1。要想求和我们一般需要知道这个子列的左端下标和右端下标,再求这个子列的和。最简单的…...

线性基 学习笔记

什么是线性基? 先来回顾一下向量空间中的基。这个基代表着空间的一个极大线性无关子集,组中向量线性无关,且空间中的任意一个向量都可以唯一地由基中的向量来表示 那么回到线性基,它其实就类似于是一个向量空间的基 我们考虑一…...

算法-回溯算法-组合问题

77. 组合https://leetcode.cn/problems/combinations/ 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1: 输入:n 4, k 2 输出: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,…...

ABAP中的Null值与space 以及 BW中ADSO的Key值

写出来怪丢人,到现在还没搞懂这个。 在BW中创建ADSO,定义Key字段。可以看到ADSO表的定义中,所有的Key和Data属性如下: 所有的key会有关键字key打头,所有字段都有not null. 但是并不是有个字段是blank空的就不能更新进…...

JavaScript库之Lodash常用方法

Lodash 中文文档https://www.lodashjs.com/docs/lodash.omit/以下总结了在项目中常用的方法,其他的慢慢更新语言:cloneDeep这个方法类似_.clone,除了它会递归拷贝 value。(注:也叫深拷贝)参数value (*): 要…...

Kotlin新手教程二(Kotlin基本数据类型及基础语法)

一、基本数据类型 1.数字 由于Kotlin支持类型推断,所以在使用时若超出Int的范围则会被认定为其它类型;若需要显式指定Long型值,则需要在值后添加L后缀。 2.浮点数 3.比较两个数( 和 ) Kotlin 中没有基础数据类型&a…...

git idea创建新分支,获取/合并主支代码的2个方法

其他sql格式也在更新中,可直接查看这个系列,要是没有你需要的格式,可在评论或私信我 个人目录 获取主支代码的2个方法1,创建一个分支,获取主支的所有代码(场景:我需要一个自己的分支进行编写模…...

CF1714A Everyone Loves to Sleep 题解

CF1714A Everyone Loves to Sleep 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例解释题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1代码实现题目 链接 https://www.luogu.com.cn/problem/CF1714A 字面描述 题面翻译 题目描述 Vlad和其他人一样&am…...

oracle官方下载历史版本JDK版本

背景 日常工作中由于一些特殊原因,我们需要下载指定系统指定位数指定版本的jdk,这个时候去网上搜索下载就会遇到各种坑,病毒、诱导连接、诱导关注/注册、付费、错误版本等,所以最好的办法是去官网下载,下面列举两种方式…...

双击-jar包无法运行解决方法

我自己是通过探索出来的方法解决的,网上的方法适合普通问题 网络流传方法 那种-jar和run.bat的就是曲解了问题意思,问题不是如何运行,而是如何双击jar包就可以直接运行。 普通小问题就是修改注册表,将java路径写进去后面加个 %1…...

程序员的自我修养第七章——动态链接 (下)

接上一篇。 7.3 地址无关代码 对于现代机器来说,引入地址无关代码并不麻烦,我们展示下各种模型的地址引用方式: 1. 模块内部函数调用 2. 模块内部的数据访问,如全局变量、静态变量。 3. 模块外部的函数调用,跳转。 4.…...

蓝桥杯刷题——基础篇(二)

这部分题目,主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的,蓝桥杯与ACM考察内容甚至评测标准基本都一样,因此本训练计划提供完整的刷题顺序,循序渐进,提高代码量,巩固基础。因竞赛支持C语言、C、Java甚至…...

PTA L1-049 天梯赛座位分配(详解)

前言:内容包括:题目,代码实现,大致思路,代码解读 题目: 天梯赛每年有大量参赛队员,要保证同一所学校的所有队员都不能相邻,分配座位就成为一件比较麻烦的事情。为此我们制定如下策…...

Linux部分参数作用讲解

♥️作者:小刘在C站 ♥️个人主页:小刘主页 ♥️每天分享云计算网络运维课堂笔记,努力不一定有收获,但一定会有收获加油!一起努力,共赴美好人生! ♥️夕阳下,是最美的绽放&#xff0…...

Java kafka

JAVA面试题--Kafka(最新最全) 目录概述需求:设计思路实现思路分析1.URL管理2.网页下载器3.爬虫调度器4.网页解析器5.数据处理器拓展实现性能参数测试:参考资料和推荐阅读)Survive by day and develop by night. talk for import b…...

DBA之路---Stream数据共享同步机制与配置方法

oracle的Stream解析–数据共享 在g版本常用,如果是c版本项目一般都会选择goldengate,比stream靠谱多了 Oracle中的stream是消息队列一种应用形式,原理如下: 收集oracle中的事件,将事件保存在队列里,然后将…...

CF1790E Vlad and a Pair of Numbers 题解

CF1790E Vlad and a Pair of Numbers 题解题目链接字面描述题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1思路代码实现题目 链接 https://www.luogu.com.cn/problem/CF1790E 字面描述 题面翻译 共有 ttt 组数据。 每组数据你会得到一个正整数 xxx&…...

YOLO26改进95:全网首发--c3k2模块添加ESC模块

论文介绍 论文核心内容翻译 本文致力于解决轻量级图像超分辨率(SR)任务中Transformer模型的高计算开销问题。基于对自注意力机制层间重复性的观察,提出了一种卷积化自注意力模块——卷积注意力(ConvAttn),该模块通过单个共享大核和动态卷积核,模拟自注意力机制的远程建…...

全网最全 10个AI论文平台:开源免费测评,开题报告与毕业论文写作必备工具推荐

在当前学术研究日益数字化的背景下,AI写作工具已成为高校师生和科研人员不可或缺的辅助工具。然而,面对市场上种类繁多的平台,如何选择真正高效、实用且符合个人需求的工具,成为一大难题。为此,我们基于2026年的实际测…...

隧道施工目标检测数据集VOC+YOLO格式3012张19类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):3012标注数量(xml文件个数):3012标注数量(txt文件个数):3012标注类别…...

!devnode 扩展显示设备树中节点的相关信息的一个例子中的CmResourceList和BootResourcesList和IoResList

!devnode 扩展显示设备树中节点的相关信息的一个例子中的CmResourceList和BootResourcesList和IoResListCmResourceListBootResourcesList IoResList!devnode 扩展显示设备树中节点的相关信息。 dbgcmd!devnode Address [Flags] [Service] !devnode 1 !devnode 2参数地址 指定…...

Python-flask大学生课表查询和上课提醒系统小程序

目录需求分析技术选型数据库设计后端实现前端实现提醒功能实现测试与部署扩展功能项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析 明确系统核心功能:课表查询、上课提醒、用户管理…...

使用KART-RERANK为AE视频片段自动生成标签与智能检索方案

使用KART-RERANK为AE视频片段自动生成标签与智能检索方案 你是不是也遇到过这样的烦恼?电脑里存了成百上千个After Effects(AE)视频模板和素材片段,每次想找个“科技感蓝色光效开场”,都得在文件夹里大海捞针&#xf…...

AIGlasses OS Pro C语言基础:嵌入式视觉开发入门

AIGlasses OS Pro C语言基础:嵌入式视觉开发入门 用最简单的方式,带你进入智能眼镜的视觉开发世界 1. 开篇:为什么选择AIGlasses OS Pro? 如果你对智能眼镜开发感兴趣,但又觉得门槛太高,那么AIGlasses OS …...

ANIMATEDIFF PRO优化升级:MP4输出、LUT调色,让动画更专业

ANIMATEDIFF PRO优化升级:MP4输出、LUT调色,让动画更专业 1. 从“能动的GIF”到“可交付的成片”,你只差这一步 如果你已经用ANIMATEDIFF PRO生成过几段动画,可能会发现一个现实问题:生成的GIF文件,在手机…...

keepalived vs 手动配置:多虚拟IP方案选型及性能对比实测

多虚拟IP部署方案深度评测:Keepalived与手动配置的实战抉择 在分布式系统架构中,虚拟IP(VIP)作为服务入口的统一抽象层,其稳定性和性能直接影响整个系统的可用性表现。当业务需要部署多个虚拟IP时,技术团队…...

手把手教程:用mPLUG-Owl3-2B快速搭建你的专属图片聊天机器人

手把手教程:用mPLUG-Owl3-2B快速搭建你的专属图片聊天机器人 想不想拥有一个能看懂图片、还能跟你聊天的AI助手?比如你拍一张风景照,它能告诉你这是什么地方;或者上传一张产品图,它能帮你分析设计亮点。今天&#xff…...