JS的原型和原型链浅析

原型与原型链

在 JavaScript 中,原型(Prototype)是对象的一种特殊类型,它是所有对象共享属性和方法的机制。每一个 JavaScript 对象都与一个原型对象相关联,并且通过原型链来继承属性和方法。

1. 原型(Prototype)

每个对象在创建时都会有一个内部属性 [[Prototype]],它指向该对象的原型。在 JavaScript 中,原型通常通过 __proto__ 属性访问,或者可以通过 Object.getPrototypeOf() 方法获取。

原型本质上是一个普通对象,拥有可以共享的属性和方法。对象通过它的原型来访问这些共享的属性和方法。

2. 原型链(Prototype Chain)

原型链是一种链式结构,通过一个对象的 [[Prototype]] 属性将多个对象链接起来。当你访问对象的属性时,如果该对象本身没有这个属性,它会沿着原型链查找该属性,直到找到为止。如果原型链的末端仍然没有该属性,则返回 undefined

代码示例

创建对象与原型链
// 构造函数
function Animal(name) {this.name = name;
}// 在原型上定义一个方法
Animal.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};// 创建一个 Animal 对象
const dog = new Animal('Dog');// 通过实例访问原型方法
dog.sayHello();  // Output: Hello, my name is Dog// 查看dog的原型
console.log(dog.__proto__ === Animal.prototype);  // true

解析:

  1. Animal.prototype 定义了 sayHello 方法,这个方法并不是直接在实例 dog 上定义的,而是通过原型链来访问的。
  2. 当我们调用 dog.sayHello() 时,JavaScript 引擎会先查看 dog 是否有 sayHello 方法,如果没有,则沿着原型链去 Animal.prototype 上找。
  3. 由于 dog 是通过 Animal 构造函数创建的,所以 dog.__proto__Animal.prototype
原型链的查找机制
function Animal(name) {this.name = name;
}Animal.prototype.sayHello = function() {console.log(`Hello from ${this.name}`);
};function Dog(name, breed) {Animal.call(this, name);  // 继承 Animal 的属性this.breed = breed;
}// 继承 Animal 的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;Dog.prototype.bark = function() {console.log(`${this.name} says Woof!`);
};const myDog = new Dog('Max', 'Golden Retriever');myDog.sayHello(); // Hello from Max
myDog.bark();     // Max says Woof!

解析:

  1. Dog 通过 Object.create(Animal.prototype) 来继承 Animal 的原型方法。
  2. myDog 对象继承了 Animal 的方法 sayHelloDog 的方法 bark
  3. myDog.sayHello() 调用时,JavaScript 引擎沿着原型链查找,首先找到 Dog.prototype 上的 sayHello 方法。
instanceof 运算符

instanceof 用于检查对象是否为某个构造函数的实例。它基于原型链工作,检查对象的原型链中是否有构造函数的 prototype 属性。

console.log(myDog instanceof Dog);   // true
console.log(myDog instanceof Animal); // true
console.log(myDog instanceof Object); // true

解析:

  1. myDog instanceof Dog 返回 true,因为 myDogDog 的实例,且 Dog.prototype 存在于 myDog 的原型链中。
  2. myDog instanceof Animal 也返回 true,因为 Dog.prototype 继承自 Animal.prototype,所以 myDog 的原型链也包含 Animal.prototype

原型的应用场景

1. 方法共享

通过将方法定义在构造函数的原型上,多个实例对象可以共享相同的功能,而不需要每次创建对象时都重新定义方法,从而节省内存空间。

function Person(name) {this.name = name;
}// 共享方法
Person.prototype.greet = function() {console.log(`Hello, my name is ${this.name}`);
};const p1 = new Person('Alice');
const p2 = new Person('Bob');p1.greet(); // Hello, my name is Alice
p2.greet(); // Hello, my name is Bob
2. 模拟继承

原型链机制是 JavaScript 实现继承的一种方式。通过修改构造函数的原型,我们可以实现不同类型之间的继承。

function Shape(name) {this.name = name;
}Shape.prototype.describe = function() {console.log(`This is a ${this.name}`);
};function Circle(name, radius) {Shape.call(this, name);this.radius = radius;
}Circle.prototype = Object.create(Shape.prototype);
Circle.prototype.constructor = Circle;Circle.prototype.area = function() {return Math.PI * this.radius * this.radius;
};const myCircle = new Circle('Circle', 5);
myCircle.describe(); // This is a Circle
console.log(myCircle.area()); // 78.53981633974483

解析:

  1. Circle 通过 Object.create(Shape.prototype) 继承了 Shape 的方法 describe
  2. Circle 添加了自己的方法 area,实现了继承的同时扩展了新方法。

总结

  • 原型(Prototype) 是对象的一个内部属性,每个对象都有一个与之关联的原型,原型是对象共享方法和属性的机制。
  • 原型链(Prototype Chain) 是多个对象通过原型属性连接起来的链式结构,访问对象属性时会沿着原型链逐级查找。
  • 常见应用场景包括方法共享模拟继承等。

通过理解原型和原型链的机制,我们可以更加高效地管理对象的属性和方法,利用继承和共享减少内存开销,提高代码的复用性和可维护性。

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

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

相关文章

Vue 中实现节点对齐

Vue 如何将两个 Dom 节点进行对对齐,在前端页面中如何快速的对两个节点元素进行对齐操作,最简单的方式就是使用 Postion:Relative 加 Absolute 实现两个元素的相对位置。今天使用 dom-align 库实现节点对齐,实现以下效果&#xff…

计算机网络-HTTP协议

HTTP HTTP是一种不保存状态,即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源,理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前,咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

NLP 分词技术浅析

一、NLP 分词技术概述 (一)定义 自然语言处理(NLP)中的分词技术是将连续的文本序列按照一定的规则切分成有意义的词语的过程。例如,将句子 “我爱自然语言处理” 切分为 “我”、“爱”、“自然语言处理” 或者 “我…

深度学习面试相关-2024.12.15记录

深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…

SEO初学者-搜索引擎如何工作

搜索引擎基础搜索引擎是如何建立索引的搜索引擎如何对网页进行排名搜索引擎是如何个性化搜索结果的 搜索引擎的工作方式是使用网络爬虫抓取数十亿个页面。爬虫也称为蜘蛛或机器人,它们在网络上导航并跟踪链接以查找新页面。然后,这些页面会被添加到搜索引…

构建centos docker基础镜像

1、介绍 比较老的版本docker镜像,不太好找,可以尝试自己构建 各版本构建基础镜像方法不太一样,方式也不同,自己尝试,本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 (1)安…

多曝光融合中无监督学习方法主导的深度思考

在计算机视觉领域,多曝光融合一直是一个备受关注的研究方向。这项技术旨在将同一场景在不同曝光条件下拍摄的多张图像合成为一张包含完整动态范围信息的图像。近年来,深度学习方法在这个领域取得了显著进展,但有一个有趣的现象值得我们深入探…

Linux脚本语言学习--上

1.shell概述 1.1 shell是什么? Shell是一个命令行解释器,他为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以使用Shell来启动,挂起,停止甚至是编写一些程序。 Shell还是一个功能相当强大…

活动预告|云原生创新论坛:知乎携手 AutoMQ、OceanBase、快猫星云的实践分享

近年来,云原生技术迅猛发展,成为企业数字化转型的关键动力,云原生不仅极大地提升了系统的灵活性和可扩展性,还为企业带来了前所未有的创新机遇。 12 月 28 日 知乎携手 AutoMQ、OceanBase 和快猫星云推出“云原生创新论坛”主题的…

XXE靶场

XXE-lab 靶场 靶场网址&#xff1a;http://172.16.0.87/ 第一步我们看到网站有登录框我们试着用 bp 去抓一下包 将抓到的包发到重放器中 然后我们构建palody <!DOCTYPE foo [ <!ENTITY xxe SYSTEM "php://filter/readconvert.base64-encode/resourceC:/flag/fla…

djiango DRF的使用

djiango DRF的使用 一 、初始 DRF序列化环境安装环境配置数据模型定义定义DRF序列化模型对象 二 、DRF请求和响应请求对象&#xff08;Request objects&#xff09;响应对象&#xff08;Response objects&#xff09;状态码&#xff08;Status codes&#xff09;包装&#xff0…

【BUG】记一次context canceled的报错

文章目录 案例分析gorm源码解读gin context 生命周期context什么时候cancel的什么时候context会被动cancel掉呢&#xff1f; 野生协程如何处理 案例分析 报错信息 {"L":"ERROR","T":"2024-12-17T11:11:33.0050800","file"…

Qt WORD/PDF(四)使用 QAxObject 对 Word 替换(QWidget)

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二…

使用nvm对node进行多版本管理

1.nvm下载及安装 下载链接 下载完成后&#xff0c;对文件进行解压安装&#xff0c;按照提示一步步安装&#xff0c;如果电脑上之前有安装过node&#xff0c;需要先卸载&#xff0c;再进行安装。 按照提示完成安装。 2.设置环境变量 可以现在C:\Users\name\AppData\Roamin…

基于Socket实现客户端和服务端的Tcp通信(C#)

0.前言 使用C#和Unity实现复刻Liar’s bar中的功能 软件开发大作业 本系列文章用于记录与分享开发过程中使用到的知识点&#xff0c;以及常见错误 本文主要描述有关网络编程的内容 目录 0.前言1.使用Socket搭建Server1.1Server端的Socket连接1.2 Server端接收Client的信息1.3…

eclipse 如何设置项目、不同类型文件的 utf8 编码

编码问题一直是软件开发中让人头疼的小细节&#xff0c;尤其是团队协作中&#xff0c;若编码格式不统一&#xff0c;乱码问题便会频繁出现。那么如何在 Eclipse 中统一设置项目和文件的 UTF-8 编码&#xff0c;避免因编码问题造成不必要的困扰呢&#xff1f;今天&#xff0c;我…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…

Edge Scdn用起来怎么样?

Edge Scdn&#xff1a;提升网站安全与性能的最佳选择 在当今互联网高速发展的时代&#xff0c;各种网络攻击层出不穷&#xff0c;特别是针对网站的DDoS攻击威胁&#xff0c;几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性&#xff0c;越来越多的企业开始关注Edge …