简单理解什么是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,一经查实,立即删除!

相关文章

Ubuntu操作系统安装过程简介

以下是Ubuntu使用Ubiquity安装器的详细安装过程: 1. 准备工作 - 首先,获取Ubuntu的安装介质。可以是官方网站下载的ISO镜像文件,并将其制作成可引导的USB启动盘(可使用Rufus等工具),或者是Ubuntu安装光…

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

这一节主要了解一下鸿蒙中自定义点击事件,主要是实现在父组件点击子组件后获取子组件的返回参数。 栗子: 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…

Spark 3.3.x版本中Runtime Filter在非分区字段上的设计实现分析

文章目录 什么是Runtime FilterJOIN示例 Runtime Filter的作用Runtime Filter的分类分区字段的Filter表达式DynamicPruningSubquery 非分区字段的Filter表达式BloomFilterSubqueryInSubquery 在非分区字段上的Runtime Filter的生成过程插入Runtime Filter优化开始自底向上更新P…

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

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

什么影响网站的SEO排名

1.多IP多C段配置:海外站群服务器通常提供多IP多C段配置,这使得网站可以拥有多个独立的IP地址,有效避免同一IP下多个网站之间的关联性问题,降低被搜索引擎认为是站群作弊的风险。通过将不同的内容部署在不同的IP地址和C段上&#x…

SQL 视图:概念、应用与最佳实践

SQL 视图:概念、应用与最佳实践 SQL(Structured Query Language)视图是数据库管理中的一个重要概念,它允许用户以虚拟表的形式查看数据。视图在数据库中并不实际存储数据,而是提供了一个查询结果的快照,这…

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…

HTTP的初步了解

目录 前言 一、HTTP协议的基本概念 1.1、请求格式 1.2、响应格式 二、HTTP链接问题 前言 提示:这里可以添加本文要记录的大概内容: HTTP协议是超文本传输协议 HTTP的短连接:建立连接——数据传输——关闭连接 HTTP的长连接:…

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

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

python openai 关于会话管理问题(一)

目录 一、会话长度 二、会话保持 三、上下文窗口管理 1、对话中token使用 2、截断策略 3、消息注释 一、会话长度 线程和消息表示助手和用户之间的会话会话。每个线程的消息限制为100,000条。一旦消息的大小超过了模型的上下文窗口,线程将尝试聪明地截断消息,然后再完…

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

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