面试题之---解释一下原型和原型链

  • 实例化对象

    1. 和普调函数一样,只不过调用的时候要和new连用(实例化),不然就是一个普通函数调用
    2. function Person () {}
      const o1 = new Person()   //能得到一个空对象
      const o2 = Person()   //什么也得不到,这就是普通的函数调用
  • 原型

原型就是一个为对象实例定义了一些公共属性和公共方法的对象模板。
  • 函数原型--prototype

        每一个函数天生自带一个成员,叫做prototype,是一个对象空间。

        在函数的prototype里面存储的内容,不是给函数使用的,是给函数的每一个实例化对象使用的。

  • 对象原型__proto__

        每一个对象天生自带一个成员,叫做__proto__,是一个对象空间。

        这个__proto__对象空间是给每一个对象使用的。

function Person () {}
const o1 = new Person()
console.log(o1.__proto__ === Person.prototype) //true

        实例化对象的__proto__和所属的构造函数的prototype是一个对象空间

function Person(name) {  this.name = name;  
}  Person.prototype.sayHello = function() {  console.log(`Hello, my name is ${this.name}`);  
};  const person1 = new Person('Alice');  
person1.sayHello(); // Output: Hello, my name is Alice

        在这个例子中,person1 对象通过 __proto__ 属性访问 Person.prototype,从而可以调用 sayHello 方法。

  • constructor

        实例化对象的__proto__里面也有一个成员叫做constructor。

        这个属性就是指向当前这个对象所属的构造函数。

function Person () {}
const o1 = new Person()
console.log(o1.constructor === Person) //true
  • 原型链

  1. 对象之间的继承关系通过构造函数的prototype指向父类对象,直到指向Object对象为止形成的指向链条。
  2. 通俗讲: 原型链是原型对象创建过程的历史记录。
  3. 注:在javascript中,所有的对象都拥有一个__proto__属性指向该对象的原型(prototype)

  • 当一个对象我们不知道准确的是谁构造的时候,我们就把它看成object的实例化对象
  • 也就是说,我们的构造函数的prototype的__proto__指向的是object.prototype

  • 那么object.prototype也是一个对象,我们有一句话叫万物皆对象,所以object.prototype就到顶了,object.prototype的__proto__就是null

  • 查找顺序:当你访问某个属性时,JavaScript 采用以下顺序查找:

    • 看对象本身是否有这个属性。
    • 如果没有,查看该对象的 __proto__ 是否有这个属性。
    • 如果还没有,继续查找 __proto__.__proto__,依此类推,直到查到 Object.prototype。如果在整个原型链中都未找到,返回 undefined
  • 原型关系图

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

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

相关文章

Java项目实战II基于微信小程序的助农扶贫的设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着移动互联网技术的快速发展&#xf…

【Linux】阿里云服务器搭建gradio实例

文章目录 0 前言1 整体结构2 Python开放环境搭建2.1 SSL安装2.2 python安装 3 开发3.1 工具使用3.2 gradio3.3 langchain 4 nginx部署4.1 下载安装4.2 配置访问gradio 5 服务编写6 扩展:安装软件步骤总结 0 前言 因为课程原因,需要做一个大模型相关的大作…

vue3中如何实现标准元素 拖动 功能 【收藏备用】

最近在用vue3做一个企业后台管理系统的项目,在登录页面的时候需要用户滑动滑块来获取验证码登录系统 用到了元素拖放 这里也顺便记录一下 如何使用的. 目录 1.功能介绍 2.代码部分 3 实现过程 3.1 设置可拖动元素 3.2 拖动什么 3.3 放到何处 3.4 进行放置 1.功能介绍…

小水电远程集控运维系统简介及应用价值

一、政策背景 2023年7月14日水利部办公厅印发了《智能化小型水电站技术指南( 试行)》和(《小水电集控中心技术指南( 试行)》两个指导性文件,明确要求实施小水电绿色改造和现代化提升工程,推进建设智能集约的现代化小水电。 二、系统概述 小…

公司电脑加全屏水印怎么加(怎么打水印满屏)?4个方法精选!包教包会!

在企业管理中,为了保护公司机密信息的安全,给公司电脑添加全屏水印已成为一种常见的安全措施。 全屏水印不仅可以震慑潜在的窥探者,还能在信息不慎泄露时提供追溯线索。 那么,如何给公司电脑添加全屏水印呢? 以下是4…

AI大模型开发架构设计(18)——基于大模型构建企业知识库案例实战

文章目录 1 LLM 大模型在工作中的实际应用以及局限性LLM 大模型工作中实际应用大模型2点局限性 2 基于大模型和向量数据库的企业级知识库架构剖析向量数据库向量数据库选型知识库文档检索增强(Retrieval Augmented Generation)向量数据库应用技术总体架构向量数据库应用离线索引…

10款PDF合并工具的使用体验与推荐!!!

在如今的信息洪流中,我们几乎每个人都被淹没在大量的数字文档之中。无论是学生、教师还是职场人士,我们都需要高效地管理和处理这些文档。而PDF文件,凭借其跨平台的稳定性和通用性,成了最常用的文档格式之一。我们经常需要处理、编…

Redis做分布式锁

(一)为什么要有分布式锁以及本质 在一个分布式的系统中,会涉及到多个客户端访问同一个公共资源的问题,这时候我们就需要通过锁来做互斥控制,来避免类似于线程安全的问题 因为我们学过的sychronized只能对线程加锁&…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…

12、Linux系统的网络基本设置

查看网络接口信息ifconfig ip addr/ip a #简单查看网络接口信息 ifconfig #表示只显示当前活跃的设备接口信息 ifconfig -a #查看当前主机所有的(all)网络设备,包括未运行的设备。 如我们查看本机网卡ens33的…

JDK1.8升级JDK不生效

最近因为项目原因,需要将jdk1.8升级到JDK11.升级发生了一个纠结的问题,就是cmd不生效。在此记录! 项目中指定jdk 如果在android studio项目,可以单独指定该项目的jdk,而不用全局升级,可以做如下配置&#…

八 Bean的生命周期

八、Bean的生命周期 8.1 什么是Bean的生命周期 Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。 所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象? 创建Bean对象的前后会调用什…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview,在回顾复习一次webview相…

OpenGL ES 共享上下文实现多线程渲染

OpenGL ES 共享上下文时,可以共享哪些资源? 共享上下文实现多线程渲染 EGL 概念回顾 EGL 是 OpenGL ES 和本地窗口系统(Native Window System)之间的通信接口,它的主要作用: 与设备的原生窗口系统通信; 查询绘图表面的可用类型和配置; 创建绘图表面; 在OpenGL ES 和…

09C++结构体

/*结构体属于用户自定义的数据类型&#xff0c; 允许用户存储不同的数据类型, 语法:struct 结构体名{结构体成员列表} ;*/ //struct 结构体名 变量名 #include <iostream> #include <string> using namespace std; struct student { string name; int age;int s…

python第七次作业

01.设计一个函数&#xff0c;可以传入一个或多个单词的字符串&#xff0c;并返回该字符串&#xff0c;但所有五个或更多字母的单词都前后颠倒 a input("输入:") print(a) #将一句话以空格为分界拆分为单个单词 b a.split(" ") ls_1 [] ls_2 []for i i…

C++开发基础之使用librabbitmq库实现RabbitMQ消息队列通信

1. 前言 RabbitMQ是一个流行的开源消息队列系统&#xff0c;支持多种消息协议&#xff0c;广泛用于构建分布式系统和微服务架构。可以在不同应用程序之间实现异步消息传递。在本文中&#xff0c;我们将熟悉如何使用C与RabbitMQ进行消息通信。 2. 准备工作 在 Windows 平台上…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

图像处理实验一(Matlab Exercises and Image Fundamentals)

一、基本概念介绍 MATLAB是一种广泛使用的高性能语言&#xff0c;特别适用于数学计算、算法开发、数据分析和可视化。在图像处理领域&#xff0c;MATLAB提供了强大的工具和函数&#xff0c;使得图像的读取、处理和分析变得相对简单。通过MATLAB&#xff0c;用户可以实现从基本的…

番外-JDBC:2024年最新java连接数据库教程

前言 JavaScript的内容晚点更新&#xff0c;今天继续更新一点番外&#xff0c;今天更新的是jdbc&#xff0c;如何用java连接数据库 1.导包 要使java能够连接数据库我们需要导入一个包&#xff0c;请按照以下操作安装并导包 1.进入官网 MySQL 以上为官网链接进去后点击下载…