JavaScript 原型和原型链

JavaScript|深入了解JS原型链 原型prototype 每个函数都有一个prototype属性,它默认指向一个object空对象(没有我们定义的属性),即称为原型对象。这里一般讨论构造函数。 其中Objecty也是有原型对象的。 当函数通过构造函数形式调用时,它所创建的对象都有一个隐含的属性:指向构造函数的原型对象,我们可以通过 __proto__ 来访问该属性。 原型对象中还有一个contructor属性,它指向函数对象。 构造函数、实例和原型对象在内存中的关系图1: 图1对应的伪代码如下: function Myclass(){ 阅读详情

基本认识

​ 原型对象:无论什么时候,只要创建一个新的函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性就指向函数的原型对象

​ 原型链:任何一个实例对象都有一个__proto__的属性,该属性是指向该实现对象的构造函数的原型对象。

​ 而构造函数的原型对象也有一个__proto__的属性,指向它的构造函数的原型对象。这样一层一层就形成了一条原型链。而一般来说,原型链的最顶部是Object的原型对象

// 创建测试构造函数 Person
function Person(name,age){
    this.name = name;
    this.age = age;
}
// 创建测试实例对象 p
var p = new Person("Jack",20);
// true
// 说明实例对象p的__proto__属性指向构造函数Person的原型对象
console.log(p.__proto__ == Person.prototype);

// 获取构造函数Person的原型对象
var pPerson = Person.prototype;
// pPerson的__proto__属性指向Object的原型对象
console.log(pPerson.__proto__ == Object.prototype);

对象的属性访问

​ 我们对于对象的属性(方法)访问就是通过原型链进行访问的。

  1. 当我们开始访问对象的某个属性时,首先先看被访问对象本身有没有该属性,有就访问该属性,没有就去访问该对象的原型对象
  2. 然后,再看该对象的原型对象有没有该属性,有就返回该属性,没有就继续访问该对象的原型对象的原型对象。
  3. 再进行步骤2的操作
  4. 直至访问到原型链的顶部。如果还没有找到该属性,即就返回undefined
// 创建测试构造函数 Person
function Person(name, age) {
    this.name = name;
    this.age = age;
}
// 给构造函数的原型对象上添加一个属性TAG
Person.prototype.TAG = "PERSON";
// 创建一个测试实例对象p
var p = new Person("Jack",29);
// 访问实例对象上的属性name
// Jack
// 实例对象上有name的属性,就直接返回
console.log(p.name);
// 访问实例对象上的属性TAG
// PERSON
// 实例对象上没有TAG的属性,就去找其构造函数的原型对象上是否有该属性
// 有,就直接返回
console.log(p.TAG);

我们可以根据原型链实现同名属性值的"重写",这个叫做属性屏蔽

// 创建测试构造函数 Person
function Person(name, age) {
    this.name = name;
    this.age = age;
}
// 给构造函数的原型对象上添加一个属性TAG
Person.prototype.TAG = "PERSON";
// 创建一个测试实例对象p
var p = new Person("Jack",29);
// 在实例对象上添加一个属性TAG,
p.TAG = "PERSON instanceof p";
// 访问实例对象上的属性name
// Jack
// 实例对象上有name的属性,就直接返回
console.log(p.name);
// 访问实例对象上的属性TAG
// PERSON instanceof p
// 在这里就返回实例对象上的TAG属性,而不返回构造函数的原型对象上的TAG属性
// 这样就实现了同名属性值重写的效果
// 因为在实例对象上找到了TAG这个属性,这样就直接返回该属性,而不会继续向原型链向上去找
console.log(p.TAG);

原型链的使用

基于原型链的原型,我们就可以实现OO编程中常见的两个概念:构造函数和继承

1. 根据原型链原理实现类的构造函数

实现构造函数的方法很多,这里就说应用最广的组合使用构造函数和原型模式实现OO编程的构造函数

// 创建测试构造函数 Person
function Person(name, age) {
    // 这里所初始化的每一个属性都是每一个实例对象都有的
    this.name = name;
    this.age = age;
}
// 在构造函数的原型上定义公共属性和方法
// 类似于Java中的那些static变量和方法
Person.prototype = {
    constructor: Person,
    sayName: function () {
        console.log(this.name);
    }
}
// 创建测试实例对象p1
var p1 = new Person("zhangsan",20);
// 创建测试实例对象p2
var p2 = new Person("lisi",24);
// Person {name: "zhangsan", age: 20}
console.log(p1);
// Person {name: "lisi", age: 24}
console.log(p2);
// zhangsan
p1.sayName();
// lisi
p2.sayName();
// true
// 这个结果说明p1的sayName方法和p2.sayName方法都指向同一个方法
console.log(p1.sayName === p2.sayName);
2. 根据原型链原理实现类的继承

实现继承的方法很多,这里讲一种实现继承的方法:组合继承

// 创建父类的构造函数 Person
function Person(name, age) {
    this.name = name;
    this.age = age;
}
// 添加公共方法和公共变量
Person.prototype = {
    constructor: Person,
    sayName: function () {
        console.log(this.name);
    }
};

// 创建子类的构造函数 Boy
function Boy(name, age, wife) {
    Person.call(this, name, age);
    this.wife = wife;
}
// 首先将Boy构造函数的原型对象指向Person函数的原型对象,
// 用于获取Person函数上的方法
Boy.prototype = Person.prototype;
// 再将constructor属性指向自己
Boy.prototype.constructor = Boy;
// 再添加自己原型对象的方法
Boy.prototype.sayWife = function () {
    console.log(this.wife);
}
// 创建测试对象 b
var b = new Boy("Jack", 29, "Alice");
// 输出对象b
// Boy {name: "Jack", age: 29, wife: "Alice"}
console.log(b);
// 调用父类方法,Jack
b.sayName();
// 调用自己类的方法,Alice
b.sayWife();
js原型链污染 JavaScript 原型链是实现继承的一种方式,每个对象都有一个内部属性(在代码中可通过__proto__访问),它指向该对象的原型对象。当访问一个对象的属性或方法时,JavaScript 首先会在该对象本身查找,如果找不到,就会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的末尾(传统的面向对象(例如java),采用类的形式,以类为模版创建对象JavaScript 是基于原型链实现继承和封装。 阅读详情

相关推荐

AWS 小白书 [1] 全球架构

小白应该知道的 AWS 知识

boshansolo的博客 704

【JavaScript】一文了解JS原型与原型链

浅解JavaScript中原型与原型链的概念及其应用

ztK63LrD的博客 1261

实用工具抓取youtube热门数据

YouTube作为全球第二大搜索引擎,2024年日均视频播放量突破50亿次,头部创作者单月广告分成可达百万美元量级。但对数据分析者而言,其反爬机制堪称业界最严: ‌反爬技术升级‌:Google部署的Botguard系统可检测异常流量,触发机制包括: 单IP每小时请求超过50次即封禁 检测Headless浏览器指纹(如Chrome的navigator.webdriver属性) 动态加载内容(如评论数据需滚动页面3次后加载) ‌数据价值维度‌:某MCN机构研究显示,前100热门视频的标题关键词复用率高达67%

26万+

彻底弄懂javaScript中的原型、原型链(手绘js原型链图)

原型和原型链都是来源于对象而服务于对象的概念,所以我们要先明确一点:JavaScript中一切引用类型都是对象,对象就是属性的集合。、、、、等都是引用类型。也就是说 数组是对象、函数是对象、正则是对象、对象还是对象。 二、原型和原型链是什么 上面我们说到对象就是属性(property)的集合,有人可能要问不是还有方法吗?其实方法也是一种属性,因为它也是的表现形式,具体见下图。可以看到上确实多了一个的属性,值为一个函数,但是问题来了,上面并没有这个方法,为什么我们可以调用呢?这就引出了 原型。每一

懒散小青年的博客 1700

智驾域控制器硬件架构:从接口丛林到算力核心的工程解码

本文深入解析了智驾域控制器硬件架构的设计挑战与工程实践。面对复杂的接口丛林,文章详细探讨了如何高效融合摄像头、雷达等多源传感器数据,并构建以多SOC为核心的强大算力平台。同时,文章强调了电源、时钟、散热等最小系统及车规级可靠性设计的关键作用,为工程师提供了从接口驯服到算力核心协同的完整硬件解码指南。

happy2的博客 483

【Oracle数据库】Oracle11g数据库下载与安装教程(超详细安装图解)

Oracle11g是Oracle公司出的一个比较轻量版的数据库,这里重点说一下在window系统上如何安装Oracle11g, Oracle11g是很早之前的安装包,win7 系统安装时不会遇到环境不满足最低要求的提示,win11系统安装时会提醒环境不满足,修改配置文件即可(注意:先安装oracle服务端/oracle客户端,再安装第三方工具(PL/ SQL Developer,DBeaver等)服务器端环境概述:ORACLE数据库版本:Oracle 11g 64位(11.2.0)

qq_34463511的博客 1万+

Javascript原型链详解,一文带你彻底搞懂js原型、原型对象及原型链

原型链是 JavaScript 中的一个重要特性,它是实现对象之间继承关系的机制。在 JavaScript 中,每个对象都有一个原型属性,指向另一个对象。当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到对应的属性或方法为止。

greatming666的博客 2110

C#上位机开发入门:从基础到进阶的全方位指南

C#作为一门现代化编程语言,具备强大的功能和广泛的生态支持,适合用于开发各种类型的上位机应用。通过学习并掌握UI开发、通信协议、多线程编程、数据库操作等技能,你可以打造出稳定、易用、性能优异的上位机软件。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 8315

对于js的原型和原型链的理解

一、原型与原型链 JavaScript是一门基于原型的语言,在软件设计模式中,有一种模式叫做原型模式,JavaScript正是利用这种模式而被创建出来 原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式的目的是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新...

浮生离梦的博客 4万+

cartographer如何使用2个反光柱子作为一个landmark

2个反光柱的摆放要求:靠着墙摆,因为我们只能从一侧看到2个反光柱,从两侧都看到至少需要3个反光柱来定位。 landmark检测原理:因为我们是从一侧看到2个反光柱,所以看到2个反光柱在一帧激光数据中会有顺序,有2种情形,如下图 这两种情形,我们发现 情形1: 这种情形2个反光柱子被检测到的激光角度小于180,我们认为大一些激光角度的是原点。 情形2: 这种情形2个反光柱子被检测到的激光角度大于180,我们认为小一些激光角度的是原点。 这样原点就固定下来,并是唯一的。2个反光柱构成的坐标系也就确定了。和激光坐

南北粉面馆 3827

2025华为OD机试真题目录汇总 B+C+D+E卷(570道)(Python语言)

本文是华为OD机试真题(Python 语言)专栏的目录贴(持续更新中…)华为OD是Outsourcing Dispacth模式,是华为和外企德科联合招聘的简称。目前华为大多数是OD招聘。OD模式也是华为提出的一种新的用工形式,每年都会从OD项目挑优秀员工转为正编。所有OD和正式员工一样对待,没有差别,部门平时开会、评审等活动都是一起参加的,是同薪同酬,都是由华为的HR直接定的薪资,看的是我们技术能力。华为是大企业,能到华为上班也是有能力的,每个部门都有好多职位,是金子,在哪都会发光。

KJ.JK 18万+

「JavaScript深入」彻底搞懂JS原型与原型链

「JavaScript深入」彻底搞懂JS原型与原型链:原因、使用class实现继承、原型、原型链、prototype和proto

XH_jing的博客 1612

RK3588更新NPU驱动的方法

想要在 RK3588 上跑一下 deepseek 的大模型,发现目前的内核提供的 NPU 驱动比较低,无法支持新的大模型,所以需要更新一下我们的 NPU 驱动本次更新的NPU驱动仅适用于RK3588和RK3676系列。

荻夜的博客 2151

JavaScript原型和原型链

JavaScript 的核心机制原型和原型链是实现面向对象继承的关键。每个对象(除 null 外)都有一个原型对象作为模板,通过 __proto__ 属性访问,而函数对象特有的 prototype 属性指向其实例的原型。原型链由对象通过 __proto__ 连接形成,属性查找会沿链向上直至 Object.prototype(终点为 null)。通过将子类原型指向父类实例(而非直接共享父类原型)可实现继承,避免污染父类。原型链机制使 JavaScript 无需类也能实现继承,是理解面向对象编程的基础。

students33的博客 1454

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【JS】理解 JavaScript 的原型与原型链

在 JavaScript 中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是该函数的原型对象。原型对象可以包含属性和方法,这些属性和方法可以被该函数创建的所有实例对象所共享。// 输出:Hello, my name is Alice// 输出:Hello, my name is Bob在上面的例子中,Person函数的prototype属性指向一个原型对象,该原型对象包含一个sayHello方法。person1和person2都是Person。

2301_78802081的博客 1254

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

JS原型与原型链详解—JavaScript基础篇

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。字面意思即prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含属性和方法。无论什么时候,只要创建了一个新函数,就会根据一组特定规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。

qq_21280835的博客 1634

STM32F407中文手册

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

【JS】JavaScript 中的原型与原型链

JavaScript中的原型(prototype)和原型链(prototype chain)是面向对象编程中的重要概念,用于实现对象之间的继承和属性访问。

Eliaukoyx 1099

JavaScript高手之路:原型和原型链

原型和原型链是JavaScript进阶重要的概念,尤其在插件开发过程中是不能绕过的知识点,这篇文章就带你去抽丝剥茧的学习这一过程。在写博客过程中,我比较倾向和习惯从一个按例开始说起,以此为切入点一点点的进入正题,so,我们还是看看JavaScript内置对象Array来做一个数字排序得例子吧

张翠山的博客 7964

JavaScript什么是原型和原型链JS

从事前端这么久,发现原型和原型链一直都是云里雾里,网上看了好多文章、博客也还是不怎么明朗,相信被它困扰的小伙伴,不在少数 以下是我总结的原型和原型链,个人认为是比较浅显易懂的: 一、首先大家在对JS原型进行解释的时候,会涉及两个概念:构造函数、原型对象 构造函数:通俗的一句话说,就是你在script标签里面声明的函数: function Person(params) { /**我就是构造函数*/ } 原型对象:当我们创建了一个函数A,浏览器就会在内存中创建一个对象B

Liberty_yes的博客 733

JavaScript之彻底理解原型与原型链_js contructor

知识的海洋往往比想象中还要辽阔,原型与原型链这边也反复的学过多次,我认为应该学的比较全面,比较完善了。但遇到这个面试题后,我才发现我所学的只不过是一根枝干,JS里面真的有很多深层次的宝藏等待挖掘。学海无涯,与君共勉。本文部分图源:渡一教育的学习资料。

2401_87288988的博客 663

一文搞懂 js 原型和原型链

原型和原型链是JavaScript中与对象有关的重要概念,但是部分前端开发者却不太理解,也不清楚原型链有什么用处。其实,学过其他面对对象语言的同学应该了解,对象是由类生成的实例,类与类之间有继承的关系。在ES6之前,JavaScript中并没有class,实现类和继承的方法就是使用原型。在我个人看来,JS中类和原型链的设计和语法由于一些历史或包袱问题而不易用,也不易于理解。因此在ES6中推出了class相关的语法,和其他语言更接近,也更易用。ES6 class类。

我哎GIS博客 2583

我对js原型和原型链的理解

我们知道在js中,万物皆对象,对象可以说是重中之重了。每一个对象都拥有自己的属性。但是在这个世界中有很多东西都是相似的,可以归为一类,他们有共同的方法和属性。不可能让每一个对象都定义一个属性吧。那样太消耗内存了。所以,在js中怎么才能让多个对象共享一个或多个方法呢?原型的出现就是为了解决这个问题。 在js中每个对象都有一个与它关联的对象,叫做原型对象。每一次获取对象属性都是一次查询过程,当在对象...

清风了了的博客 1万+

JavaScript 原型/原型链

回到我们开篇的问题,class 关键字帮我们做了什么?instanceof 关键字又帮我们简化了什么?这两个问题的答案已经十分清晰了,但也不妨在这里做个总结:class 本质是一个语法糖,他帮我们处理绑定每个对象的原型,实现属性的共享。// 无 class 的写法// true// 对应的 class 写法显而易见的,class 的写法更符合我们面向对象的编程习惯,function 的写法则相对不那么直观。

专注前端领域方向的内容 1653

带你搞懂JavaScript中的原型和原型链

原型和原型链是JavaScript中与对象有关的重要概念,但是部分前端开发者却不太理解,也不清楚原型链有什么用处。

Coding home - 漂流瓶jz 1267

【JS】JS基础--原型和原型链

JavaScript的原型和原型链是其面向对象编程的核心机制。原型(Prototype)是对象共享属性和方法的基础,每个对象(除null外)都有一个[[Prototype]]属性指向其原型。原型链通过__proto__串联对象,实现属性和方法的继承查找。构造函数通过prototype属性定义实例的原型,而__proto__指向对象的原型。ES6的class语法是原型继承的语法糖。关键概念包括原型链查找机制、Object.getPrototypeOf、instanceof和hasOwnProperty等工具方

取悦于己 1334
上一篇: JavaScript Symbol对象
下一篇: 网络基础 tcp的三次握手和四次挥手
Re_Code
博客等级 码龄9年 2粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值