当前位置: 首页 > news >正文

JavaScript--原型与原型链

在JavaScript中,原型(prototype)是一个非常重要且独特的概念,它在对象创建和继承方面发挥着关键作用。理解原型及其相关的机制有助于更好地理解JavaScript的对象模型,以及如何设计和使用对象和继承。

JavaScript–原型与原型链

  • 所有函数都有一个特别的属性:
    • prototype : 显式原型属性
    • 每个函数都有一个 prototype 属性,这个属性是一个对象,它包含了可以被该函数创建的所有实例共享的属性和方法。当我们通过构造函数(使用 new 关键字)创建一个新对象时,该对象内部会链接到构造函数的 prototype 对象上。
    • 主要用来实现基于原型的继承,让多个对象实例能够共享同一组属性和方法,从而节省内存。
// 每个函数都有一个prototype属性, 它默认指向一个对象(即称为: 原型对象)
function fn() {}
console.log(fn.prototype, typeof fn.prototype)//object 'object'// 原型对象中有一个属性constructor, 它指向函数对象
console.log(fn.prototype.constructor===fn)//true// 2. 给原型对象添加属性(一般都是方法)
function F() {}
F.prototype.age = 12 //添加属性
F.prototype.setAge = function (age) { // 添加方法this.age = age
}
// 创建函数的实例对象
var f = new F()
console.log(f.age)//12
f.setAge(23)
console.log(f.age)//23
  • 所有实例对象都有一个特别的属性:
    • __ proto __ : 隐式原型属性
    • 每个JavaScript对象都拥有一个内部属性 [[Prototype]],通常可以通过 __ proto __ 访问(虽然这不是标准属性,但在大多数浏览器中是可用的)。从ES5开始,推荐使用 Object.getPrototypeOf 来获取对象的原型。
    • 当试图访问对象的一个属性时,如果该对象本身没有此属性或方法,那么引擎就会尝试在其 [[Prototype]] 中查找。这构成了所谓的“原型链”。
//对象的隐式原型的值为其对应构造函数的显式原型的值 
function Fn() {}
var fn = new Fn()
console.log(Fn.prototype, fn.__proto__)//object  object
console.log(Fn.prototype===fn.__proto__)//true
  • 显式原型与隐式原型的关系
    • 函数的prototype: 定义函数时被自动赋值, 值默认为{}, 即用为原型对象
    • 实例对象的__ proto__: 在创建实例对象时被自动添加, 并赋值为构造函数的prototype值
    • 原型对象即为当前实例对象的父对象
      在这里插入图片描述

原型链(隐式原型链)

  • 原型链是由一些对象通过其内部的 [[Prototype]] 属性相互关联而形成的一条链路。这条链路用于解析属性:当读取对象的某个属性时,如果该对象自身没有此属性,则会沿着这条链向上寻找,直到找到该属性或到达链的末端。
  • 每当创建一个新的函数,JS引擎会为这个函数添加一个 prototype 属性,指向一个对象。当用这个函数作为构造函数来创建新的对象实例时,这些实例的 [[Prototype]] 将自动指向构造函数的 prototype。这样就形成了一个链,允许属性和方法的继承。所有的实例对象都有__ proto__属性, 它指向的就是原型对象

在这里插入图片描述

  • 函数的显示原型指向的对象默认是空object实例对象(但object除外)
    • console.log(Object.prototype instanceof Object)//false
  • 所有函数都是Function的实例(包含Function)
    • console.log(Function.proto===Function.prototype)//false
  • Object的原型对象是原型链的尽头
  • instanceof
    • 表达式: A instanceof B
    • 如果B函数的显式原型对象在A对象的原型链上, 返回true, 否则返回false

在这里插入图片描述

function Foo() {  }
var f1 = new Foo();
console.log(f1 instanceof Foo);//true
console.log(f1 instanceof Object);//true

在这里插入图片描述

console.log(Object instanceof Function)//true
console.log(Object instanceof Object)//true
console.log(Function instanceof Object)//true
console.log(Function instanceof Function)//true
function Foo() {}
console.log(Object instanceof  Foo);//false
  • 典例:
var A = function() {}
A.prototype.n = 1var b = new A()A.prototype = {n: 2,m: 3
}var c = new A()
console.log(b.n, b.m, c.n, c.m)//1 undefined 2 3

在这里插入图片描述

var F = function () { };
Object.prototype.a = function () {console.log('a()')
};
Function.prototype.b = function () {console.log('b()')
};
var f = new F();
f.a()//a()
f.b()//报错 原型链找不到
F.a()//a()
F.b()//b()

相关文章:

JavaScript--原型与原型链

在JavaScript中,原型(prototype)是一个非常重要且独特的概念,它在对象创建和继承方面发挥着关键作用。理解原型及其相关的机制有助于更好地理解JavaScript的对象模型,以及如何设计和使用对象和继承。 JavaScript–原型…...

hive—常用的日期函数

目录 1、current_date 当前日期 2、now() 或 current_timestamp() 当前时间 3、datediff(endDate, startDate) 计算日期相差天数 4、months_between(endDate, startDate) 日期相差月数 5、date_add(startDate, numDays) 日期加N天 6、date_sub(startDate, numDays) 日期减…...

HTML零基础入门教学

目录 一. HTML语言 二. HTML结构 三. HTML文件基本结构 四. 准备开发环境 五. 快速生成代码框架 六. HTML常见标签 6.1 注释标签 6.2 标题标签:h1-h6 6.3 段落标签:p 6.4 换行标签:br 6.5 格式化标签 6.6 图片标签&a…...

vue3 父组件调用子组件 el-drawer 抽屉

之前 Vue3 只停留在理论&#xff0c;现在项目重构&#xff0c;刚好可以系统的实战一下&#xff0c;下面是封装了一个抽屉表单组件&#xff0c;直接在父组件中通过调用子组件的方法打开抽屉&#xff1a; 父组件&#xff1a; <template><div id"app"><…...

Java中常用算法之选择排序算法

一.选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法。它的工作原理是每次从未排序部分选择最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其放到已排序部分的末尾。以下是用Java实现选择排序的代码及其详细讲解。 二.选择排序代码 publ…...

UNIX简史

从1991年Linux出现至今&#xff0c;由于众多IT巨头以及技术社区的推动&#xff0c;Linux已经成为非常成熟、可用于各种关键领域的操作系统&#xff0c;适当了解其发展历史&#xff0c;对于理顺其技术流派、从而更好地学习和使用Linux具有重要意义。由于其基于UNIX系统二十多年的…...

React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法

React 在 React 中&#xff0c;forwardRef 是一种高级技术&#xff0c;它允许你将 ref 从父组件传递到子组件&#xff0c;从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件&#xf…...

uniapp 常用的指令语句

uniapp 是一个使用 Vue.js 开发的跨平台应用框架&#xff0c;因此&#xff0c;它继承了 Vue.js 的大部分指令。以下是一些在 uniapp 中常用的 Vue 指令语句及其用途&#xff1a; v-if / v-else-if / v-else 条件渲染。v-if 有条件地渲染元素&#xff0c;v-else-if 和 v-else 用…...

python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分

【1】引言 前序已经对BGR图像和HSV图像的转换进行了基本讨论&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;十二&#xff09;BGR图像转HSV图像-CSDN博客 python学opencv|读取图像&#xff08;十三&#xff09;BGR图像和HSV图像互相转换深入-C…...

C# 结构体和类

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、类&#xff08;Class&#xff09;二、结构体&#xff08;Struct&#xff09;示例代码&#xff08;定义类和结构体&#xff09;类的继承代码示例&#xff08…...

D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。

概述&#xff1a; D9741是一块脉宽调制方三用于也收路像机和笔记本电的等设备上的直流转换器。在便携式的仪器设备上。 主要特点&#xff1a; ● 高精度基准电路 ● 定时闩锁、短路保护电路 ● 低电压输入时误操作保护电路 ● 输出基准电压(2.5V) ● 超过工作范围能进行自动校…...

题目 1738: 排序

题目 1738: 排序 时间限制: 2s 内存限制: 96MB 提交: 14351 解决: 3477 题目描述 对输入的n个数进行排序并输出。 输入格式 输入的第一行包括一个整数n(1<n<100)。 接下来的一行包括n个整数。 输出格式 可能有多组测试数据&#xff0c;对于每组数据&#xff0c;将排序后…...

爬虫逆向学习(十四):分享一下某数通用破解服务开发经验

阅前须知 这篇博客不是教大家怎么实现的&#xff0c;而且告知大家有这个东西&#xff0c;或者说一种趋势&#xff0c;借此分享自己大致的实现经验。具体的实现我也不好整理&#xff0c;毕竟是在别人的基础上缝缝补补。 前言 使用补环境方式破解过某数的同学都知道&#xff0…...

《Vue进阶教程》第十一课:响应式系统介绍

1 什么是响应式 当数据改变时, 引用数据的函数会自动重新执行 2 手动完成响应过程 首先, 明确一个概念: 响应式是一个过程, 这个过程存在两个参与者: 一方触发, 另一方响应 比如说, 我们家小胖有时候不乖, 我会打他, 他会哭. 这里我就是触发者, 小胖就是响应者 同样, 所谓…...

rpc设计的再次思考20251215(以xdb为核心构建游戏框架)

1.服务提供者注册的方式 // 表明这是一个服务提供者&#xff0c;ServerType 和 ServerId从application.properties中读取 // 而且只有当当前服务是Game时&#xff0c;才生效。 或者 条件注解??? RpcProvider(typeServerType.Game) public class GameProvider{MsgReceiver…...

pydub AudioSegment增加音频文件音量并保存- python 实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

IT 新突破!远程控制电脑技术造就工作与学习新方向!

远程控制电脑技术的历史可追溯到计算机网络的早期时代。最初&#xff0c;通过电话线和调制解调器的组合&#xff0c;实现了远程访问&#xff0c;这是远程控制电脑技术的雏形。随着互联网技术的飞速发展&#xff0c;远程控制电脑技术也日趋完善&#xff0c;并在多个领域得到了广…...

LabVIEW起落架震台检测

在现代飞机制造与维护过程中&#xff0c;起落架的性能测试是保障飞机安全的重要环节。通过LabVIEW开发的起落架小落震台检测系统&#xff0c;通过模拟飞机着陆过程&#xff0c;准确捕捉起落架在着陆时承受的各种动力学特性和应力响应&#xff0c;有效提升起落架设计的精度与可靠…...

Day24 C++ 接口(抽象类)

C 接口&#xff08;抽象类&#xff09; 接口描述了类的行为和功能&#xff0c;而不需要完成类的特定实现。 C 接口是使用抽象类来实现的&#xff0c;抽象类与数据抽象互不混淆&#xff0c;数据抽象是一个把实现细节与相关的数据分离开的概念。 如果类中至少有一个函数被声明…...

UE5 关于画质、机能与开发成本的思考

1、并不省时间 UE5等工具优点是可以通过一些工具与资源快速获得较好的画面&#xff0c;节约一些时间&#xff0c; 但缺点也很多&#xff0c; 一个是各种精度的素材之间的协调问题&#xff0c;参差不齐&#xff0c;统一升级到高精度会产生较大的成本&#xff0c; 一个是资源…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...