浅谈 JavaScript 原型链

MTK_android11_WIFI(内网)和4G(外网)共存 阅读详情

在这里插入图片描述


阅读原文


概述

在 JavaScript 中有种说法叫 “万物皆对象”,就是说无论是构造函数创建的实例,构造函数本身、原型对象、数组、函数本质上都是对象,都拥有 __proto__ 属性,即隐式原型,所有函数都拥有 prototype 属性,即显式原型(仅限函数),原型对象(prototype 属性指向的对象),在定义函数时就被创建。


原型链指向概述

在 JavaScript 中整个原型链及查找机制用下图可以完整的表示出来:

在这里插入图片描述

原型链指向:

1、通过字面量和 new Object() 所创建的对象,他们是构造函数是 function Object() 的实例,Object 构造函数的 prototype 指向原型对象 Object.prototype,Object.prototype 的 constructor 指向构造函数 Object,而实例的 __proto__ 也指向 Object.prototype,Object.prototype 的 __proto__ 指向 null,所以 Object.prototype 也叫做顶级原型对象。

2、上图中 new Foo() 创建的对象是构造函数 function Foo() 的实例,Foo 的 prototype 指向原型对象 Foo.prototype,Foo.prototype 的 constructor 指向构造函数 Foo,而实例的 __proto__ 也指向 Foo.prototype,并且 Foo.prototype 虽然是原型对象,但也是对象,所以是构造函数 Object 的实例,__proto__ 指向顶级原型对象 Object.prototype。

3、数组的构造函数是 function Array() 原型链的指向与其他除 Object 以外的构造函数相同,Array.prototype 的 __proto__ 也指向顶级原型对象 Object.prototype,每一个数组都是 Array 的实例,__proto__ 都指向 Array.prototype。

4、Object、Array、Foo 等构造函数的本质也是对象,他们的构造函数是 function Function(),Function 的 prototype 指向 Function.prototype,Function.prototype 的 constructor 指向 Function,所有的构造函数的 __proto__ 都指向 Function.prototype,包括 Function 本身,也就是说构造函数 Function 是由自己构造的,Function.prototype 的 __proto__ 同样指向顶级原型对象 Object.prototype。


prototype 原型对象

prototype 是函数的一个属性,属性的值指向了一个对象,所以,只有函数才有 prototype 原型对象。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

typeof Person.prototype; // object
Person.prototype.constructor; // Person {}
Person.prototype.job = "qianduan";

var p1 = new Person("panda", 18);
var p2 = new Person("shen", 20);

p1.constructor.prototype; // 实例对象查找构造函数原型对象的方法

一般会把对象共有的属性和方法都放在构造函数的原型对象上。


实例、构造函数、原型对象的关系

构造函数的原型 prototype 属性指向一个原型对象,实例也可以通过 __proto__ 指向原型对象,但本质上实例和构造函数之间是没有关系的。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

var p = new Person("nihao", 16);
p.constructor = { name: "haha" };
p.name; // nihao

上面的代码中改变了构造函数的值为一个对象,对象中的属性 name 并没有影响实例的 name 属性值。


实例属性 __proto__

上面访问实例 p 的原型,实际使用 p.constructor.prototype 去找原型对象,当构造函数的值改变后是找不到原型对象的,所以实例并不是通过 constructor.prototype 去查找原型对象的,而是通过每一个实例都有的 __proto__ 属性,这个属性指向创建实例的构造函数原本的原型对象,这个属性不是标准,在 IE 下不存在。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.job = "qianduan";
var p = new Person("nihao", 16);

p.__proto__.job; // qianduan

当构造函数的 prototype 属性值被改变之后,在之前创建的实例的 __proto__ 属性值的仍然引用原型对象,所以对构造函数改变前创建的实例是没有影响的,会影响后面创建的实例。


原型链查找机制

实例对象在调用了一个属性或方法时,如果对象本身没有这个属性或方法,会去自己的原型对象查找,也就是 __proto__ 中查找,如果原型对象中没有,去原型对象的原型对象查找,一般(原型链没有被修改)情况下就是去 __proto__ 的 __proto__ 中查找,即顶级原型对象 Object.prototype,如果实例对象本身有这个属性,则直接输出,不再向上查找,如果对象本身和原型对象具有同名属性,则会屏蔽掉原型对象的属性。

function Person(name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.job = "qianduan";
var p = new Person("nihao", 16);

p.job; // qianduan
p.job = "houtai";
p.job; // houtai
p.__proto__.job; // qianduan

总结

原型链的指向及原型链的查找机制是 JavaScript 中非常重要的基础知识,理解原型链是更深入了解继承和面向对象编程的必经之路。


YOLOv8改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用 本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks及其改进的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法:直接加入(第五节讲解添加步骤)。模块加入如下:模块改进方法:基于的(第五节讲解添加步骤)。第二种改进方法是对中的进行改进,并将 阅读详情

相关推荐

ADS SerDes仿真实战:深入解析Tx_Diff均衡器(EQ)参数对眼图质量的影响

本文以ADS仿真平台为基础,深入解析了SerDes设计中Tx_Diff均衡器(EQ)参数对信号完整性的核心影响。通过实战演示,详细对比了去加重(De-emphasis)与FIR抽头系数两种调节模式,揭示了它们如何有效对抗信道损耗与码间干扰,从而显著改善眼图的高度、宽度与抖动性能,为高速串行链路设计提供关键调优思路。

weixin_29230901的博客 226

执行上下文

执行上下文 1.根据代码的位置不同可分为两类: * 全局代码 * 函数代码 2. 全局执行上下文: window 对象 * 在执行全局代码前将window确定为全局执行上下文 * 对全局数据进行预处理 * var定义的全局变量赋值为undefined, 添加为window的属性 * function声明的全局函数==>赋值(fun)方法, 添加为windo...

libufan的博客 228

关于LIO-SAM编译时出现错误 /usr/bin/ld: 找不到 -lBoost::timer

关于LIO-SAM编译时出现错误: 下载LIO-SAM代码 进入LIO-SAM文件夹,通过以下代码编译: mkdir build cd build cmake .. make 报错: /usr/bin/ld: 找不到 -lBoost::timer collect2: error: ld returned 1 exit status CMakeFiles/lio_sam_imuPreintegration.dir/build.make:759: recipe for target 'devel/lib/li

wwtx的博客 3648

JavaScript原型&原型链浅解

原型 任何对象都有一个关联的原型对象,这个原型对象由对象的内置属性__proto__指向它的构造函数的prototype指向的对象。 也就是说任何对象都是由一个构造函数创建,被创建的对象都可以获得构造函数的prototype属性。 对象没有prototype属性,只有函数才有prototype属性。 任何对象都有一个constructor属性,指向创建此对象的构造函数,比如说{}对象,它的构造函数是function Object(){}。 原型链 因为每个对象和原型都有原型,对象的原型指向原型对象, 而

weixin_41993525的博客 224

MIMO技术入门

MIMO:多天线技术,发射端和接收端有多个天线(注意:并不是指多个天线板,而是多套振子,每一套是一个独立的天线。) 4G:2、8天线 5G:4、64天线(64T64R) 手机也是多天线 MIMO实现效果的分类: 1)空间分集 。2)空间复用。3)波束赋形。 空间分集(space diversity) 作用:提升接收质量 利用多个天线发射或者接收一个数据流,避免单个信道衰落对整个链路的影响。(比如你的耳机坏了一只并不影响另一只) 空间复用(space multiplexing) 作用:提升速率 利

About1129的博客 2876

从仿真到打样:PMOS栅极泄放电路设计全流程复盘与三个踩坑点总结

本文详细复盘了PMOS栅极泄放电路从仿真到打样的全流程设计,重点总结了三个关键踩坑点:三极管BE结过压击穿、静态功耗超标和栅极振荡现象。通过优化缓启动电路、改进保护设计和布局调整,最终实现18ms开通时间、190μs关断时间和8μA静态功耗的工业级性能指标,为类似电源开关设计提供实用参考。

weixin_28693683的博客 371

02 重学js-原型链,this指向及改变this指向

原型链,this指向及改变this指向

qq_37550440的博客 1051

告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)

本文介绍如何利用Python和pywinauto库构建微信个人助手,实现自动回复、定时消息、智能收款等功能,告别重复劳动。通过详细的代码示例和配置指南,帮助开发者快速掌握微信自动化技术,提升工作效率。

weixin_42568801的博客 330

JS中构造函数与原型

JS中原型相关知识 什么是原型? 用处 修改原型prototype: 1、单个增加某属性or方法: 构造函数.prototype.属性名or方法名 = 需要添加的属性内容or方法; var friend = new Person(); Person.prototype.sayHi = function(){ alert("hi"); }; friend.sayHi(); //"hi"(成功执行!) 2、重写整个原型对象: function Person(){ } var friend =

Joe_yuqiao的博客 536

2026年3月GESP真题及题解(C++七级):物流网络

2026年3月GESP真题及题解(C++七级):物流网络

王老师青少年编程 1126

在 SAP BTP 中通过 MTA 自动创建 Service Broker 的原理与实战

本文探讨了如何在SAP BTP的Cloud Foundry环境中通过MTA部署自动创建和注册Service Broker。传统手动注册方式存在依赖管理员、环境一致性差等问题。通过MTA部署可实现自动化Broker注册,利用占位符生成安全凭证,并确保平台端与应用端认证一致。文章详细解析了关键配置参数,包括create-service-broker标志、Broker名称、认证凭据和访问URL的设置方法。这种基础设施即代码(IaC)方式能提升DevOps实践水平,使服务注册成为应用部署流水线的有机组成部分。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 200

深入理解javascript原型链

  在javascript中原型和原型链是一个很神奇的东西,对于大多数人也是最难理解的一部分,掌握原型和原型链的本质是javascript进阶的重要一环。今天我分享一下我对javascript原型和原型链的理解。 一、对象等级划分   我们认为在javascript任何值或变量都是对象,但是我还需要将javascript中的对象分为一下几个等级。   首先Object是顶级公民,...

weixin_34245169的博客 480

用 SAP HANA SDA 访问 PostgreSQL:从可行性到落地实践的完整指引

摘要:SAP HANA可通过SDA/SDI技术访问PostgreSQL数据库,支持数据虚拟化和实时复制。主要实现路径包括:1)使用Camel JDBC适配器创建虚拟表进行联邦查询;2)利用PostgreSQL Log Reader适配器实现变更数据捕获(CDC)。实施时需配置Data Provisioning Agent,注意权限和网络要求。官方文档指出,通过SDI+DP Agent的方式比直接SDA连接更稳定可靠。虚拟化查询时,HANA会自动将SQL下推到PostgreSQL执行,优化性能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 256

浅谈JavaScript原型链

先来看一下,构造函数----实例----原型三者之间的关系 JavaScript怎么实现继承? 1.经典继承 var o = { name:"张三", age:"18" }; var obj = Object.create(o); console.log(obj.name,obj.age); 结果   2.混入式继承...

controllerha的博客 1480

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

浅谈js原型原型链

原型和原型链是js的核心,因为js是以原型链的形式,保证函数或对象的属性可以向下传递。那来看看什么是原型链。 一、基本概念 –proto–:每一个实例对象都有一个私有属性(–proto–),指向它的构造函数的原型对象。该原型对象上也有一个自己的–proto–,可以指向它的原型对象,这样可以一直找到object,object是所有对象的原型,最终指向null。 prototype:指向对象或函数的原型,只有函数才有prototype。 constructor:指向原型对象的构造函数。 二、构造函数与原型的关系

qq_43690370的博客 239

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

浅谈JavaScript的原型与原型链

相关概念 对于使用过基于类的语言 (如 Java 或 C++) 的开发人员来说,JavaScript 有点令人困惑,因为它是动态的,并且本身不提供一个 class 实现。(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的)。 当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象( object )都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype )。该原型对象也有一个自己的原型对象( prot

qq_40545204的博客 193

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

浅谈js中的原型、原型链、原型链继承

原型对象、 构造函数、实例对象 原型对象:这个要从构造函数开始说起,每个构造函数都会带有一个 prototype 属性。该属性是个指针,指向了一个对象,我们称之为 原型对象。什么是指针?指针就好比学生的学号,原型对象则是那个学生。我们通过学号找到唯一的那个学生。假设突然,指针设置 null, 学号重置空了,不要慌,对象还存在,学生也没消失。只是不好找了,用代码来解释可以这样 Person.prot...

hp123456003的博客 305

浅谈js原型和原型链

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

hao255的博客 1312

浅谈JavaScript原型链机制

接上一条,如果遍历其原型链时存在对应的foo属性,并且该属性只读(writable:false),则不会修改该属性或者创建该对象实例的直接属性,总之什么都不会发生(在非严格模式下会抛出错误)此方法与(2)相比,解决了原型对象引用共享的问题,但是如果函数Foo存在一些副作用(如修改状态,给this添加属性等),同样会影响到Bar的实例对象,此法也不可取。如果obj对象没有直接包含名为foo的属性,就会历其原型链,如果仍然找不到名为foo的属性,则foo会被添加到obj的直接包含属性中。有一定轻微性能损失。

qq_43293207的博客 469

浅谈js中的原型及原型链

要想明白js中原型以及原型链是什么,就需要先搞明白对象和函数的关系 Object和Function的关系 Object和Function都作为JS的自带函数,Object继承自己,Funtion继承自己,Object和Function互相是继承对方,也就是说Object和Function都既是函数也是对象。 console.log(Function instanceof Object); //...

wxd_97的博客 1136

浅谈js中的原型与原型链

了解原型首先要了解构造函数 一、构造函数 构造函数模式的目的是为了创建一个自定义类,并创建这个类的实例,构造函数模式中拥有了类和实例的概念, 构造函数本身也是一个普通的函数,创建方式和普通函数没有区别,旦构造函数习惯上首字母大写。另外就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用。 <script> function Person(name,age...

TXW6666的博客 250

浅谈javascript之原型和原型链

原型和原型链是js中的难点也是重点,明白了原型和原型链会让我们在后面不管是学习还是工作都会更加高效,并且原型和原型链会是面试中必不可少的话题。 一,函数对象 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型) 所有函数拥有prototype属性(显式原型)(仅限函数) 原型对象:拥有prototype属性的对象,在定义函数时就被创建 二,构造函数 //创建构造函数 ...

mo123456opuiop的博客 203

JavaScript基础之浅谈原型和原型链

前面聊了一些对象的构造函数,前面如果了解的后就可以聊原型和原型链了,其实这个听着很瘆人,不过简单的了解然后换一个名词,觉得原来如此了。 原型(prototype) 原型(prototype)其实就是function的对象的一个属性,打印出来的话也就是一个对象,如下 function Objthis(name,year){ this.name=name; this.year=year; } console.log(Objthis.prototype) 既然

u011863822的博客 1742

浅谈JavaScript中的原型,原型链

JavaScript中的原型,原型链 在构造函数中: function Person(first, last, age, eyecolor) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eyecolor; } 如果我们想给这个函数增加属性,就会发现我们无法为已有的对象构造器添加新属性。 Person.nationality = "English"; 如需向构

fish_skyyyy的博客 294
上一篇: 封装一个 cookie 功能
下一篇: JavaScript 的继承方式及优缺点
Panda Shen
博客等级 码龄10年 18粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值