简单理解什么是js原型链(注意“提问”的问题)

原型链是 JavaScript 中实现对象属性继承的一种机制。它允许对象通过其原型(prototype)从其他对象继承属性和方法。

1. 原型(Prototype)

每个 JavaScript 对象都有一个内部链接,指向另一个对象,这个对象称为该对象的原型。当你访问一个对象的属性时,JavaScript 首先会查找该对象自身的属性,如果该属性不存在,JavaScript 会查找这个对象的原型,并向上查找该原型的原型,直到找到所需的属性或到达原型链的顶端(通常是 Object.prototype)。

2. 原型链的组成

  • 原型对象:每个函数都有一个特殊的属性 prototype,这个属性指向函数的原型对象,通常用于构造函数创建的实例对象的原型。
  • 实例对象的 __proto__ 属性:当使用构造函数创建对象时,实例对象的 __proto__ 属性会指向构造函数的 prototype 对象。

3. 访问属性的过程

当访问对象的属性时,JavaScript 引擎遵循以下步骤:

  1. 检查对象自身是否有该属性。
  2. 如果没有,检查对象的原型。
  3. 如果原型上也没有,继续检查原型的原型,直到找到该属性或到达 Object.prototype
  4. 如果最终没有找到,返回 undefined

4. 示例

以下是一个简单的示例,演示原型和原型链的工作原理:

function Person(name) {this.name = name;
}Person.prototype.sayHello = function() {console.log(`Hello, my name is ${this.name}`);
};const john = new Person('John');john.sayHello(); // 输出: Hello, my name is John

在这个例子中:

  • Person 是构造函数。
  • johnPerson 的实例,john 对象有一个名为 name 的属性。
  • 当我们调用 john.sayHello() 时,JavaScript 引擎的工作过程如下:
    • 检查 john 对象自身是否有 sayHello 方法。
    • john 对象没有该方法,于是查找其原型 Person.prototype
    • Person.prototype 中找到了 sayHello 方法,因此调用它。

5. 小结

原型链是 JavaScript 的核心特性之一,允许对象之间共享属性和方法,支持多重继承。它是 JavaScript 提供的一个强大机制,用于动态属性和方法的查找与继承。理解原型链有助于我们更深入地掌握 JavaScript 的对象模型和实现更复杂的功能。


提问:john的constructor指向谁

在 JavaScript 中,对于通过构造函数创建的对象(例如 john),其 constructor 属性指向创建该对象的构造函数。这意味着 john.constructor 指向 Person 构造函数。

你可以通过以下代码来验证这一点:

function Person(name) {this.name = name;
}const john = new Person('John');console.log(john.constructor === Person); // 输出: true

然而,需要注意的是,john.constructor 这个属性是从其原型链上获取的,具体地说,john 的原型 __proto__(即 Person.prototype)上有一个 constructor 属性,这个属性指向 Person 构造函数。

在 JavaScript 的原型链中,john__proto__Person.prototype,而 Person.prototype.constructorPerson。可以这样理解:

  • john.__proto__ 指向 Person.prototype
  • Person.prototype.constructor 指向 Person

因此,john.constructor 通常会返回 Person。不过,需要注意的是,如果构造函数的 prototype 被修改,constructor 属性可能不再指向原来的构造函数。因此,在实际使用中,最好确认 constructor 属性的正确性。

提问:那 Person.prototype的__proto__指向谁

在 JavaScript 中,所有对象都有一个内部属性 [[Prototype]],通常可以通过 __proto__ 属性来访问。

在构造函数 Person 的原型 Person.prototype 上,它的 __proto__ 指向 Object.prototype。也就是说,对于任何由 Person 构造的实例(如 john)来说,其原型链最终都会指向 Object.prototype。因此:

console.log(Person.prototype.__proto__ === Object.prototype); // 输出: true

Object.prototype 是所有 JavaScript 对象的顶层原型,包含一些默认的方法和属性,比如 toStringhasOwnProperty 等。

所以总结一下:

  • Person.prototype.__proto__ 指向 Object.prototype
  • Object.prototype.__proto__ 指向 null,这是原型链的结束。

提问:Person.prototype还有一个属性为prototype么
在 JavaScript 中,Person.prototype 本身不具有名为 prototype 的属性。它的结构如下:

  • Person 是一个函数对象,而 Person.prototype 是一个对象,用于指定 Person 的实例所共享的属性和方法。
  • Person.prototype 本身有一个 constructor 属性,指向 Person 函数。

可以简单地概括如下:

  • Person 对象是一个构造函数,具有 prototype 属性。
  • Person.prototype 是一个对象,它没有 prototype 属性,而是它的本身属性(例如,constructor)。

为了进一步说明这一点,可以用代码来查看:

function Person(name) {this.name = name;
}console.log(Person.prototype); // 输出: { constructor: [Function: Person] }
console.log(Person.prototype.prototype); // 输出: undefined

在这个例子中,你会发现 Person.prototype.prototypeundefined。这表明 Person.prototype 不具有名为 prototype 的属性。

总结:

  • Person 作为构造函数有一个 prototype 属性。
  • Person.prototype 是一个对象,但它没有 prototype 属性。

提问:那Person.prototype的__proto__指向谁

在 JavaScript 中,所有对象都有一个 __proto__ 属性,这个属性指向该对象的原型。

对于 Person.prototype,它的 __proto__ 指向 Object.prototype,这是所有 JavaScript 对象的顶层原型。

你可以通过以下代码来查看这个关系:

function Person(name) {this.name = name;
}console.log(Person.prototype.__proto__ === Object.prototype); // 输出: true

在这个例子中,Person.prototype.__proto__ 指向 Object.prototype,所以你可以认为 Person.prototype 继承自 Object.prototype

总结:

  • Person.prototype.__proto__ 指向 Object.prototype
  • 这使得 Person 的实例,诸如 john,能够访问 Object.prototype 中的属性和方法,例如 toStringhasOwnProperty

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

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

相关文章

鸿蒙笔记--自定义点击事件

这一节主要了解一下鸿蒙中自定义点击事件,主要是实现在父组件点击子组件后获取子组件的返回参数。 栗子: import { MyCustomButton } from ./MyCustomButton;Entry Component struct Index {State message: string Hello World;build() {Column(){MyC…

第三十一章 Vue之路由(VueRouter)

目录 一、引言 1.1. 路由介绍 二、VueRouter 三、VueRouter的使用 3.1. 使用步骤(52) 3.2. 完整代码 3.2.1. main.js 3.2.2. App.vue 3.2.3. Friend.vue 3.2.4. My.vue 3.2.5. Find.vue 一、引言 1.1. 路由介绍 Vue中路由就是路径和组件的映…

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享,写出来分享给大家,希望有志同道合的小伙伴可以一起交流技术,一起进步~ 说明:本篇博客基于sel…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体,它用于条件编译和 SFINAE(Substitution Failure Is Not An Error)。enable_if 的主要作用是通过条件编译来控制模板的实例化,从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

【自然资源】关于多测合一,你了解吗?

关于多测合一,你了解吗? “多测合一” 是指:按照“统一标准、多测合并、成果共享”要求和“应合尽合、能合则合”原则,对同一工程建设项目各个阶段的多项测绘服务事项进行整合优化的测绘服务和管理模式。 是将工程建设项目竣工验…

江协科技STM32学习- P28 USART串口数据包

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

HarmonyOS鸿蒙开发入门,常用ArkUI组件学习(二)

书接上回,让我们继续来学习ArkUI的其他组件 目录,可以点击跳转到想要了解的组件详细内容 组件四:Button组件五:Slider组件六: Column & Row组件七:循环控制组件八: List 组件四:…

SqlSugar查询达梦数据库遇到的异常情况

使用SqlSugar连接达梦数据库,联查两张表的数据遇到的奇怪问题:同一套代码,在一个环境中可以正常查询并返回数据,但在另一环境中运行则查不到数据。在个人电脑上测试时也能正确运行,搞不清楚是怎么回事,特此…

ip地址分为几大类-IP和子网掩码对照表

一、IP地址的基本概念与分类 IP地址是用于在网络中标识每个设备的逻辑地址。互联网协议将IP地址分为A、B、C、D和E五类,其中A、B、C三类最常用,它们主要根据地址的首位位数以及用途进行划分。 A类地址: 范围:0.0.0.0 - 127.255.2…

【AI开源项目】Botpress - 开源智能聊天机器人平台及其部署方案

文章目录 Botpress 概述Botpress 的定位 Botpress 的主要特点1. OpenAI 集成2. 易于使用3. 定制和扩展性4. 多平台支持5. 集成和扩展 API6. 活跃的社区和详尽的文档 部署方案集成集成开发集成部署机器人示例开发工具代理本地开发先决条件从源代码构建 Botpress 如何解决常见问题…

JetPack Compose安卓开发之底部导航Tabbar

效果,页面切换 项目结构 TabBar.kt package com.weimin.strollerapp.components.tabbarimport androidx.compose.foundation.Image import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.f…

SpringBoot应用:精品在线试题库的设计与实现

2 相关技术 2.1 Spring Boot框架简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Sprin…

乐鑫esp32和esp32s3使用flash download tool V3.9.7工具下载固件的使用说明

使用esp32IDF工具编程后使用vscode内置的烧录工具(火的图标按钮)烧录是正常的,说明程序没有问题。 如果要使用flash download tool V3.9.7工具下载固件还是有些要注意的事项: 1.三个bin文件分别在: 第一个:…

如何在Linux系统中使用Apache HTTP Server

如何在Linux系统中使用Apache HTTP Server Apache简介 安装Apache 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动Apache服务 验证Apache是否正在运行 访问Apache默认页面 配置Apache虚拟主机 创建虚拟主机配置文件 示例虚拟主机配置 创建网站根目录 准备静态网站内…

HTTP相关返回值异常原因分析,第二部分

今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中) 一、4xx状态码 这些状态码表示请求有问题,通常是由于客户端的错误引起的。 1.1 400 Bad Request: 请求格式不正确,服务器无法理解。 状态码400的含义: …

8、Node.js Express框架

五、Express框架 5.1概念 Express框架是一个基于Node.js平台的极简、灵活的WEB开发框架:www.express.com.cn 简单来说,Express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用 5.2安装 npm i express5.3 Express初体验 //01-express初体验.js //1.导入exrp…

学习笔记——三小时玩转JQuery

也可以使用在线版,不过在线版需要有网络,网不好的情况下加载也不好 取值的时候也是只会取到有样式的纯文本,不会取到标签,会取到标签效果 prepend和append这两个方法用的比较多,before和affter用的比较少 想要把代码写…

Rust 力扣 - 54. 螺旋矩阵

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们只需要一圈一圈的从外向内遍历矩阵,每一圈遍历顺序为上边、右边、下边、左边 我们需要注意的是如果上边与下边重合或者是右边与左边重合,我们只需要遍历上边、右边即可 题解代码 i…

企业项目开发的流程

一.立项阶段 1.市场调研 了解市场需求和竞争对手情况。全面的市场调研分析报告。 用户调研:产品组针对目标用户进行定量和定性的调查,了解其需求和行为习惯,为产品的功能和设计方向提供依据。 举例:终端管家.用户分为商户和渠…

简化应用程序日志记录

什么是应用程序日志 应用程序日志是存储有关应用程序中发生的事件的信息的文件。应用程序日志包含以下信息: 用户活动,例如登录、注销、页面查看和搜索查询。应用程序错误,例如异常和崩溃。安全事件,例如登录尝试失败和可疑流量…