关于原型和原型链的学习和实践

在前端面试中,原型和原型链始终是一个避不开的问题,今天就弄明白!

原型和原型链

  • 对象的创建方式
    • 工厂模式
    • 构造函数模式
    • 原型模式
  • 原型和原型链
  • 实践

对象的创建方式

原型和原型链都是关于对象的内容,先来看一下JavaScript中对象的构建方式。

工厂模式

function createPerson(name, age, job) { 
 let o = new Object(); 
 o.name = name; 
 o.age = age; 
 o.job = job; 
 o.sayName = function() { 
 console.log(this.name); 
 }; 
 return o; 
} 
let person1 = createPerson("Nicholas", 29, "Software Engineer"); 
let person2 = createPerson("Greg", 27, "Doctor");

构造函数模式

function Person(name, age, job){ 
 this.name = name; 
 this.age = age; 
 this.job = job; 
 this.sayName = function() { 
 console.log(this.name); 
 }; 
} 
let person1 = new Person("Nicholas", 29, "Software Engineer"); 
let person2 = new Person("Greg", 27, "Doctor"); 
person1.sayName(); // Nicholas 
person2.sayName(); // Greg 

要创建 Person 的实例,应使用 new 操作符。以这种方式调用构造函数会执行如下操作。
(1) 在内存中创建一个新对象。
(2) 这个新对象内部的[[Prototype]]特性被赋值为构造函数的 prototype 属性。
(3) 构造函数内部的 this 被赋值为这个新对象(即 this 指向新对象)。
(4) 执行构造函数内部的代码(给新对象添加属性)。
(5) 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

原型模式

function Person() {} 
Person.prototype.name = "Nicholas"; 
Person.prototype.age = 29; 
Person.prototype.job = "Software Engineer"; 
Person.prototype.sayName = function() { 
 console.log(this.name); 
}; 
let person1 = new Person(); 
person1.sayName(); // "Nicholas" 
let person2 = new Person(); 
person2.sayName(); // "Nicholas" 
console.log(person1.sayName == person2.sayName); // true 

无论何时,只要创建一个函数,就会按照特定的规则为这个函数创建一个 prototype 属性(指向
原型对象)。默认情况下,所有原型对象自动获得一个名为 constructor 的属性,指回与之关联的构
造函数。对前面的例子而言,Person.prototype.constructor 指向 Person。然后,因构造函数而
异,可能会给原型对象添加其他属性和方法。

原型和原型链

  1. Person.prototype.constructor == Person // 准则1:原型对象(即Person.prototype)的constructor指向构造函数本身
  2. person01.proto == Person.prototype // 准则2:实例(即person01)的__proto__和原型对象指向同一个地方

构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个内部指针指向原型。如果原型是另一个类型的实例呢?那就意味着这个原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。

实例的隐式原型指向构建该实例的类的显式原型。
验证一下这句话:
在这里插入图片描述
p.proto===person.prototype
person.prototype.proto===Object.prototype
Object.prototype.proto===null

注意有的浏览器可能已经废除了__proto__属性,改用Object.getPrototypeOf()方法来获取对象的原型。
在这里插入图片描述
原型链例子:
在这里插入图片描述
在这里插入图片描述

示意图:
在这里插入图片描述
注意:如果通过对象自变量的方式添加新方法,会导致原型链失效
在这里插入图片描述

实践

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是C#

C#是一种面向对象的语言与c语言不同 C语言是面向过程的编程 C#运行于.NETFramework和.NETCore之上的高级语言 C#是由C和C衍生而来的一种语言 在C#中不建议使用指针 什么叫面向对象 是一种编程范式,它将现实世界中的事物抽象为对象,并通过对象之间的…

深度学习的数学PDF

链接: https://pan.baidu.com/s/1_jScZ7dcyAWGqbrad6bbCQ?pwd9gj9 提取码: 9gj9 复制这段内容后打开百度网盘手机App,操作更方便哦

【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验17 开放最短路径优先OSPF

一、实验目的 1.验证OSPF协议的作用; 二、实验要求 1.使用Cisco Packet Tracer仿真平台; 2.观看B站湖科大教书匠仿真实验视频,完成对应实验。 三、实验内容 1.构建网络拓扑; 2.验证OSPF协议的作用。 四、实验步骤 1.构建网…

SpringCloud跨微服务的远程调用,如何发起网络请求,RestTemplate

在我们的业务流程之中不一定都会是自己模块查询自己模块的信息,有些时候就需要去结合其他模块的信息来进行一些查询完成相应的业务流程,但是在SpringCloud每个模块都相对独立,数据库也有数据隔离。所以当我们需要其他微服务模块的信息的时候&…

NuGet 中国国内镜像

有时候网络不好,需要使用国内的一些镜像源。 华为资源: https://repo.huaweicloud.com/repository/nuget/v3/index.json 腾讯资源: https://mirrors.cloud.tencent.com/nuget/ 微软中国镜像源:https://nuget.cdn.azure.cn/v3…

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽

BIOTIN-Gly-Asp-Gly-Asp-Glu-Val-Asp-Gly-Cys 生物素标记多肽 生物素标记多肽的特点 高亲和力结合:生物素与链霉亲和素(streptavidin)或抗生物素蛋白(avidin)之间的结合是生物学上已知的最强的非共价相互作用之一。这种…

大模型知识大全2-资源【大模型】

文章目录 可用的模型部分模型的训练规模和数据常用数据集外文中文书籍和论文百科数据代码混合数据集微调数据集对齐数据集 可用的模型 仅记录中文可用的表现较优的模型LLaMA、LLaMA2、LLaMA3(规模在7,13,30,65左右,需要搭配ChineseLLaMA的LoRA权重使用&…

Mybatis操作和动态SQL

Mybatis操作 准备 准备数据库表 emp 创建一个新的 springboot 工程,选择引入对应的起步依赖( mybatis 、 mysql 驱动、 lombok ) application.properties 中引入数据库连接信息 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driv…

关于Linux的操作作业!24道题

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

文章SameStr(四):图4代码

“Publication Figure 4” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(caret) library(plotROC) library(tidymodel…

To美术-渲染管线及优化方向(CPU方向)

一、CPU与GPU 1、CPU与GPU的区别 橙黄色:控制单元   橙红色:存储单元  绿色:计算单元 CPU:结构组成复杂、控制逻辑丰富,计算量小,适合复杂运算 GPU:结构组成简单,核心数量多,计…

jmeter-beanshell学习5-beanshell加减乘除运算

我用到的场景是计算金额,所以主要以金额为主,感觉这部分有点麻烦,直接写遇到的几个坑,就不演示解决的过程了。 1.最早写了个两数相减,但是小数精度容易出现问题。比如1-0.010.989999997这种情况,随便写的几…

Windows 电脑查看 WiFi 密码的方法都有哪些?

从设置面板中查看 当你使用的是笔记本电脑并且连接 WiFi 之后可以在设置面板中查看 WiFi 密码,首先打开设置界面,然后点击网络和 Internet,找到 WiFi 之后点击进入,然后点击管理已知网络。 然后点击已经连接好的无线网络。 进入之…

前端Din字体和造字工房力黑字体文件

Din 字体是一种经典的、简洁的无衬线字体,它源自1930年代的德国交通标志设计。 造字工房力黑字体适用于数字,驾驶舱标题等统计界面 DIN-Medium.otf 案例 造字工房力黑.TTF 案例

最新综述:多模态引导的基于文生图大模型的图像编辑算法

文章目录 综述亮点1. 图像编辑任务的范围2. 一般性编辑算法的统一框架3. 统一框架在多模态编辑任务中的应用4. 不同组合在文本引导编辑场景下的比较5. 未来研究方向 近期,复旦大学 FVL 实验室和南洋理工大学的研究人员对于多模态引导的基于文生图(Text-t…

nvidia driver和cuda版本较低,ubuntu系统更新nvidia驱动的方法(对于小白最快最最保险的方法)

问题描述: 系统:ubuntu22.04LTS 这两天安装另一个低版本的pytorch环境,提示我的cuda版本很旧,然后运行程序时候甚至直接报错,如下所示: .local/lib/python3.10/site-packages/torch/cuda/__init__.py&quo…

DBA 数据库管理 部署Mysql 服务,基础查询

数据库:存储数据的仓库 数据库服务软件: 关系型数据库: 存在硬盘 ,制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

渲染引擎实践 - OSG引擎窗口创建过程分析(未完待续)

一:概述 一个3D应用程序,要想显示渲染结果,首先要创建一个窗口,本节就分析下OSG源码中窗口创建的过程。 二: OSG中的窗口类介绍 以GraphicsWindowX11为例,在Linux上用这个窗口类,Windows上用GraphicsWindo…

新版Android Studio中设置gradle的JDK版本

旧版android studio 在旧版(具体哪个版本号之前搞不清了)中设置JDK版本在>File——>Project Structure——>SDK location——>Gradle Setting——>Gradle SDK 新版android studio 某次更新后发现SDK location下找不到Gradle Setting选项…

SpringBoot源码阅读(5)——AnnotationAwareOrderComparator排序

SpringBoot中工厂类加载器加载的实现类通常有多个,这些类通常会排序后放入集合 AnnotationAwareOrderComparator是常用的比较器 AnnotationAwareOrderComparator 父类:OrderComparator 接口:Comparator 相关方法 public static void sort(…