JavaScript原型链深度剖析

目录

前言

一、原型链

1.原型链的主要组成

        原型(Prototype)

        构造函数(Constructor)

        实例(Instance)

2.原型链的工作原理

前言

        在JavaScript的世界中,原型链(Prototype Chain)是一个核心概念,它决定了对象如何继承属性和方法。对于初学者来说,理解原型链可能是个挑战,但一旦掌握了它,就能更好地利用JavaScript的动态性和灵活性。本篇文章将详细探讨JavaScript的原型链,帮助大家深入理解其工作原理。

一、原型链

        原型链是JavaScript中用来实现对象继承的一种机制。每个JavaScript对象都有一个内部链接到另一个对象,这个对象就是它的原型(prototype)。当试图访问一个对象的某个属性时,如果这个对象自身没有这个属性,那么JavaScript就会在这个对象的原型上查找这个属性,依此类推,一直向上查找,直到找到一个包含该属性的对象或者到达原型链的末尾(null)。这个过程就构成了原型链。

        每个JavaScript函数都有一个prototype属性,这个属性是一个指向一个对象的引用。当创建一个新对象(使用new关键字)时,这个新对象的内部[[Prototype]]链接(在ES6之前,这个链接是不可见的,但可以通过Object.getPrototypeOf()访问)会指向构造函数的prototype对象。

1.原型链的主要组成

        原型(Prototype)

        在JavaScript中,每个对象都有一个内部链接指向它的原型对象。原型对象的作用就是提供共享的方法和属性给所有实例。当我们试图访问一个对象的某个属性时,如果该对象自身没有这个属性,那么JavaScript就会在该对象的原型上查找这个属性,这就是原型链查找机制。通过这种方式,我们可以实现属性的继承和共享,减少内存占用。

        构造函数(Constructor)

        构造函数是一种特殊的函数,主要用来初始化新创建的对象。当我们使用new关键字创建一个对象时,JavaScript会调用一个构造函数来初始化这个新对象。构造函数通常与new一起使用,用来创建特定类型的对象。构造函数的主要任务是定义实例的属性和方法。

        实例(Instance)

实例是通过构造函数创建出来的具体对象。每个实例都是独一无二的,拥有自己的属性和方法。这些属性和方法可能继承自原型,也可能是在构造函数中定义的。实例与构造函数之间通过this关键字来建立联系,使得实例可以访问到构造函数中定义的属性和方法。

2.原型链的工作原理

        以下是一个具体的例子,通过构造函数、原型和实例来详细解释JavaScript中原型链的工作原理:

// 定义一个构造函数 Person  
function Person(name, age) {  this.name = name;  this.age = age;  
}  // 为 Person 的原型添加方法  
Person.prototype.greet = function() {  console.log('Hello, my name is ' + this.name + ' and I am ' + this.age + ' years old.');  
};  // 创建一个 Person 的实例  
var john = new Person('John', 30);  // 调用实例上的方法  
john.greet(); // 输出: Hello, my name is John and I am 30 years old.

        在这个例子中,我们有一个Person构造函数,它接受两个参数nameage,并在this(即新创建的对象实例)上设置这两个属性。

        接下来,我们向Person.prototype添加了一个greet方法。这意味着所有通过Person构造函数创建的实例都将能够访问这个方法,即使这个方法不是直接在实例上定义的。

当我们调用new Person('John', 30)时,JavaScript做了以下几件事:

  1. 创建了一个新的空对象。
  2. 将这个新对象的内部[[Prototype]]链接(在ES5之前是非标准属性,但在ES6中可以通过Object.getPrototypeOf()访问)设置为Person.prototype
  3. 将这个新对象作为this的上下文,执行Person函数中的代码,设置nameage属性。
  4. 返回这个新创建的对象(除非Person函数返回了另一个对象)。

        因此,john对象现在有两个属性(nameage),并且可以访问Person.prototype上的greet方法。这是通过原型链实现的:当尝试访问john.greet时,JavaScript首先在john对象自身上查找greet属性,如果没有找到,它会沿着john[[Prototype]]链接(即Person.prototype)继续查找,最终找到了greet方法并执行它。

        如果我们在Person.prototype上添加更多的方法或属性,所有已经创建的Person实例以及未来创建的实例都将能够访问这些新方法或属性,因为它们共享同一个原型对象。

        原型链的概念允许我们实现继承,并且可以动态地向对象添加新的功能,而无需修改已存在的对象。这是JavaScript中一个非常强大的特性,使得对象可以更加灵活和可扩展。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++多态(全)

多态 概念 调用函数的多种形态, 多态构成条件 1)父子类完成虚函数的重写(三同:函数名,参数,返回值相同) 2)父类的指针或者引用调用虚函数 虚函数 被virtual修饰的类成员函数 …

闪存存储和制造技术概述

闪存存储技术 引言 性能由高到低排序:SLC -> MLC -> TLC -> QLC 根据这个排序读写速度也越来越低,价格越来越便宜 1. SLC SLC(Single-Level Cell,单层单元): SLC 闪存具有最高的性能、耐用性和可…

JavaScript转换和校验数字

本节我们使用的案例还是继续之前的银行家应用程序,只不过我们呢增加了两个账号,代码如下: const account1 {owner: Jonas Schmedtmann,movements: [200, 455.23, -306.5, 25000, -642.21, -133.9, 79.97, 1300],interestRate: 1.2, // %pin…

Android 音视频播放器 Demo(二)—— 音频解码与音视频同步

音视频编解码系列目录: Android 音视频基础知识 Android 音视频播放器 Demo(一)—— 视频解码与渲染 Android 音视频播放器 Demo(二)—— 音频解码与音视频同步 RTMP 直播推流 Demo(一)—— 项目…

.NET操作 Access (MSAccess)

注意:新项目推荐 Sqlite ,Access需要注意的东西太多了,比如OFFICE版本,是X86还是X64 连接字符串 ProviderMicrosoft.ACE.OleDB.15.0;Data Source"GetCurrentProjectPath"\\test.accdb//不同的office版本 连接字符串有…

正则化回归

1. L1正则化 L1正则化是回归参数各个元素绝对值之和。 2. L2正则化 L2正则化是回归参数各个元素平方之和。 3.LOSS回归 线性回归加上L1正则化 4.岭回归 线性回归加上L2正则化 不断增大 L2 约束项参数 α,可以发现岭回归参数优化解不断靠近原点&#xff0c…

bpmn-js推荐几款常用的插件

bpmn-js整体框架库的风格是以组件的方式进行实现的,这样的结构也更加便于我们更好的对其进行功能扩展,以及客制化功能实现。其实bpmn.io已经为我们实现了较多场景的组件的实现,了解对应组件的功能更能便于我们区分是否需要自己实现,降低重复造轮子的行为,提高开发效率,本…

uniApp+Vue3+vite+Element UI或者Element Plus开发学习,使用vite构建管理项目,HBuilderX做为开发者工具

我们通常给小程序或者app开发后台时,不可避免的要用到可视化的数据管理后台,而vue和Element是我们目前比较主流的开发管理后台的主流搭配。所以今天石头哥就带大家来一起学习下vue3和Element plus的开发。 准备工作 1,下载HBuilderX 开发者…

【web安全】-- 命令执行漏洞详解

本文将从原理开始介绍命令执行漏洞并附有三个实例来供各位客官学习 文章目录 一、什么是命令执行漏洞二、出现的原因三、有可能存在命令执行漏洞的函数(php)1、利用一些函数来实现命令执行2、直接执行系统命令的函数 四、命令拼接符号1、Windows2、linux…

ES6之rest参数、扩展运算符

文章目录 前言一、rest参数二、扩展运算符 1.将数组转化为逗号分隔的参数序列2.应用总结 前言 rest参数与arguments变量相似。ES6引入rest参数代替arguments,获取函数实参。扩展运算符能将数组转化为参数序列。 一、rest参数 function namelist1() {console.log(ar…

手写一个uart协议——rs232(未完)

先了解一下关于uart和rs232的基础知识 文章目录 一、RS232的回环测试1.1模块整体架构1.2 rx模块设计1.2.1 波形设计1.2.2代码实现与tb1.2.4 仿真 1.3 tx模块设计1.3.1波形设计 本篇内容: 一、RS232的回环测试 上位机由串口助手通过 rx 线往 FPGA 发 8 比特数据&a…

服务器数据恢复—异常断电导致RAID模块故障的数据恢复案例

服务器数据恢复环境: 某品牌ProLiant DL380系列服务器,服务器中有一组由6块SAS硬盘组建的RAID5阵列,WINDOWS SERVER操作系统,作为企业内部文件服务器使用。 服务器故障: 机房供电几次意外中断,服务器出现故…