js原型和类---prototype,__proto__,new,class

原型和原型链

在js中,所有的变量都有原型,原型也可以有原型原型最终都指向Object

什么是原型

在js中,一个变量被创建出来,它就会被绑定一个原型;比如说,任何一个变量都可以使用console.log打印,这里是调用了它的toString方法,而变量被创建后可能并没有设置toString方法,但是它任然可以打印,这就从原型中获取的toString方法

 所以可以得到第一点:原型可以提供方法给实例的变量,

原型也是一个对象,或者说对象可以作为原型并赋值给其他变量,这样对象成为了变量的原型,而对象本身也有原型,此时就形成了 ‘链’

同样的这个变量也是一个对象,他也可以作为其他变量的原型,这样‘链’就变得更长了,但是所有的链都有一个最终指向(root终点)--- Object,Obejct是最原始的对象,它包含了所有js变量都共享的方法,它不再有原型属性[[prototype]], 所以在js中一切皆对象中的对象就是指的继承自Object

这里可以总结一下:

  • 原型是一个对象,它可以向继承了自身的变量提供方法(属性)
  • 变量都拥有原型,也可以成为原型,循环下去可以形成‘链’,
  • 链的最顶端是Object对象,它提供了最基本的方法

js通过原型来复用通用的方法和属性,这样极大的减少了变量创建的成本(减少了内存支出,原型的方法属性都存储在原型上,变量中不会复制过来占用内存;也不必每个对象都去书写基本的方法),

tips:

原型链:就前面说到的 变量获得原型,原型又有原型,变量又可以作为原型,这样就形成了‘链’,链的最外层(底层),拥有最多的方法,继承了原型链上所有原型的方法和属性

prototype

在 JavaScript 中,对象有一个特殊的隐藏属性 [[Prototype]](如规范中所命名的),它要么为 null,要么就是对另一个对象的引用。当我们从 object 中读取一个缺失的属性时,JavaScript 会自动从原型中获取该属性。这就是继承,object也可以从中借用方法

prototype不能在变量中被直接引用,通常没有办法遍历或者读取这个属性,所以它在控制台的名称有些特殊,使用[[ ]]引用,但是可以直接去调用它里面的方法,当你使用变量中不存在的属性或者方法,此时会自动向原型中寻找,对应的属性方法并调用,若原型链中没有则返回undefined

但是也有特例,在构造函数中,可以给构造的实例添加原型属性或方法

__proto__

这是一个过时的属性,现在只能在浏览器中使用,它的作用就是指向prototype,给原型添加属性或方法,这样添加的原型属性或方法会被遍历出来(Object.keys,for in),

let animal = {eats: true
};
let rabbit = {jumps: true
};rabbit.__proto__ = animal; // 设置 rabbit.[[Prototype]] = animal

注意__proto__ 与内部的 [[Prototype]] 不一样__proto__ 是 [[Prototype]] 的getter/setter;获取和设置原型可以使用函数 Object.getPrototypeOf/Object.setPrototypeOf 来替代 __proto__ 去 get/set 原型

new

当使用 new 关键字调用函数时,该函数将被用作构造函数。new 将执行以下操作:

  1. 创建一个空的简单 JavaScript 对象作为实例。
  2. 如果构造函数的 prototype 属性是一个对象,则将实例的 原型[[Prototype]] 指向构造函数的 prototype 属性,否则实例将保持为一个普通对象,其 [[Prototype]]为 Object.prototype, 因此,通过构造函数创建的所有实例都可以访问添加到构造函数 prototype 属性中的属性/对象。
  3. 使用给定参数执行构造函数,并将this指向实例
  4. 如果构造函数返回非原始值,则该返回值成为整个 new 表达式的结果。否则,如果构造函数未返回任何值或返回了一个原始值,则返回实例。(通常构造函数不返回值,但可以选择返回值,以覆盖正常的对象创建过程。)

 new的关键点在于,它新建了一个实例对象,同时引入了原型,改变了构造函数的this指向,让实例对象成为了这个构造函数的构造结果

class

class是es6新增的语法糖,它简化了js中构造类的步骤,隐去了对原型的操作(根本上还是原型的操作),js中的类是基于原型的,使用原型达到继承的效果,

以下使用原型prototype和类class构建一个相同的类,

prototype.js

// 使用原型构造一个P类// 构造器,大写开头规范(不强制)
function P (x,y){// this指向实例,此时this不生效,构造实例后指向实例this.x = x;this.y = y;// 实例方法,此处的this指向实例,可以使用实例的属性this.getXY = ()=>{return [this.x,this.y]}
}// 实例方法,此处的this指向windows,不能使用实例的属性
P.prototype.getPName = ()=>{return P.name
}// 实例属性
P.prototype.desc = '2维坐标'//类方法/静态方法 
P.getP = (p1,p2)=>{return [p1.getXY(),p2.getXY()]
}// 类属性/静态属性
P.des = '坐标'

class.js 

// 使用class构造一个P类class P{//构造器constructor(x,y){this.x = x;this.y = y;}// 实例属性desc = '2维坐标'// 实例方法getXY(){return [this.x,this.y]}getPName(){return P.name}// 静态属性static des = '坐标'// 静态方法static getP(p1,p2){return [p1.getXY(),p2.getXY()]}}

很明显,class的用法更加整体化,但实际上这两种的写法效果是完成相同的,

可以使用同一串代码来实例化这个类P

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>prototype,class</title>
</head><body><script src="class.js"></script><!-- <script src="prototype.js"></script> --><script>// new关键字,新建一个对象,原型指向类,获得构造器中的this指向let p = new P(1, 2);console.log(p);console.log(p.x);console.log(p.y);console.log(p.desc);console.log(p.getXY());console.log(p.getPName());console.log(P.getP(p, p));console.log(P.des);</script>
</body></html>

实现的效果是一致的方法上略有不同,对于类的构造,关键在于this的指向问题,属性和方法是挂在类名下的,还是挂在实例下的需要区分开,

挂在类下的属性方法被称为,类方法(属性)或者静态方法(属性),通过类名引用(Math.max)

挂在实例下的属性方法被称为,实例方法(属性),通过实例引用(arr.push)

总结

  • 在 JavaScript 中,所有的对象都有一个隐藏的 [[Prototype]] 属性,它要么是另一个对象,要么就是 null
  • 通过 [[Prototype]] 引用的对象被称为“原型”。
  • "prototype" 属性仅当设置在一个构造函数上,并通过 new 调用时,才具有这种特殊的影响。在常规对象上,prototype 会被当成是一个普通的属性名
  • 所以变量都通过原型/原型链使用共享的方法(即自身不存在,从原型/原型链中借用)
  • 类的使用要区分实例和静态类,哪些方法属性在类名下,哪些方法属性在实例下

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

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

相关文章

PostgreSQL 中如何实现数据的增量更新和全量更新的平衡?

文章目录 一、增量更新与全量更新的概念增量更新全量更新 二、考虑的因素1. 数据量2. 数据更改的频率和规模3. 数据一致性要求4. 系统性能和资源利用5. 业务逻辑和流程 三、解决方案&#xff08;一&#xff09;混合使用增量更新和全量更新&#xff08;二&#xff09;使用临时表…

暑期旅游季必备,用这款客服神器应对爆棚的客流咨询

解决暑期旅游客流高峰问题 暑期是旅游高峰季节&#xff0c;客流量剧增&#xff0c;客户咨询纷至沓来。在这个时候&#xff0c;如何高效处理客户的咨询成为每家旅游机构和景点不可忽视的挑战。 聊天宝快捷回复助手是一款强大的工具&#xff0c;可帮助企业在客流高峰期快速回复客…

MemFire Cloud: 一种全新定义后端即服务的解决方案

在这个快节奏的互联网时代&#xff0c;开发者们最希望的就是能够省时省力地完成项目&#xff0c;快速上线。然而&#xff0c;搭建服务、开发接口API、处理各种后端问题&#xff0c;往往让人头疼不已。别担心&#xff0c;现在有了MemFire Cloud&#xff0c;一款为懒人开发者量身…

制作电子名片的小程序系统源码 快速生成电子名片

在当今数字化时代&#xff0c;传统的纸质名片已逐渐被智能电子名片所取代。电子名片小程序作为一种基于微信生态的创新名片交换方式&#xff0c;凭借其便捷性、高效性和环保性&#xff0c;成为了众多商务人士的首选。小编分享一个制作电子名片的小程序系统源码&#xff0c;无忧…

malloc实现原理【Liunx】

malloc实现原理 malloc是什么&#xff1f;malloc,calloc, realloc的区别malloc的实现原理malloc的两种实现方式为什么使用brk&#xff1f;为什么使用mmap&#xff1f; malloc怎么定界的malloc分配的是虚拟内存上的空间吗&#xff1f; malloc是什么&#xff1f; 通过malloc&…

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud【翻译与解读】

LinK3D: Linear Keypoints Representation for 3D LiDAR Point Cloud 摘要 特征提取和匹配是许多机器人视觉任务的基本组成部分&#xff0c;如 2D 或 3D 目标检测、识别和配准。2D 特征提取和匹配已取得巨大成功。然而&#xff0c;在 3D 领域&#xff0c;当前方法由于描述性差…

2024前端面试题之Vue3

2024前端面试题之Vue3 在面试具有五年经验的前端工程师时&#xff0c;对于 Vue 3 的掌握程度是一个重要的考核点。本文将提供一系列针对这一级别工程师的 Vue 3 面试题&#xff0c;并附上详细的解析&#xff0c;帮助面试官全面评估候选人的技术实力和项目经验。 一、Vue 3 基础…

vscode-server安装和部分配置

文章目录 前言code-server安装rpm包安装tar.gz安装 vscode部分配置vscode配置函数跳转安装插件 vscode的structurevscode的hierarchy更改颜色主题 前言 vscode确实彳亍&#xff0c;虽然我觉得Clion(c/c语言版的IDEA)更方便&#xff0c;但是毕竟我没钱买license 这里记录一下网…

11410-00SF 同轴连接器

型号简介 11410-00SF是Southwest Microwave的连接器。该连接器的外壳采用优质不锈钢&#xff0c;材质为 CRES ALLOY UNS-S303500&#xff0c;符合 ASTM-A582 标准。首先&#xff0c;不锈钢材料经过锻造加工&#xff0c;形成转接器的基本形状。然后&#xff0c;外壳进行精密的 C…

CentOS7忘记root密码无法登陆解决方法

重启服务器&#xff0c;等到如图下所示界面的时候&#xff0c;快速按下键盘的↑或者↓按键&#xff0c;等固定住画面&#xff0c;然后按下e按键 然后按键盘上的↓按键&#xff0c;找到图下所示的linux16开头的那段&#xff0c;然后把光标挪到ro这里 按照图下所示&#xff0c;把…

提供跨平台的视觉安防解决方案,满足不同场景的需求的智慧交通开源了。

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…

大气热力学(6)——位温和假相当位温

本篇文章源自我在 2021 年暑假自学大气物理相关知识时手写的笔记&#xff0c;现转化为电子版本以作存档。相较于手写笔记&#xff0c;电子版的部分内容有补充和修改。笔记内容大部分为公式的推导过程。 文章目录 6.1 位温6.2 斜 T-lnP 图&#xff08;Skew T-lnP&#xff09;6.2…

第二课使用域名dns ping通www.baidu.com

需要一台dns服务器&#xff0c;实现域名解析&#xff0c;把对应的网址变为Ip地址。 首先按照之前博客的配置&#xff0c;自动分配给PC1和PC2的IP地址等相关配置。 然后增加一台server交换机连接到交换机上&#xff0c;配置好ip地址&#xff0c;192.168.1.100。在dnsServer中。…

CAD应用程序开发工具CST CAD Navigator 1.4.0.1 正式发布—— 带来了 G 代码生成功能

CST CAD Navigator是一款兼容Windows和Linux的CAD应用程序。在其简单的界面下&#xff0c;有一个可以快速查看2D图纸和3D模型的强大核心。软件可以轻松地导入和导出文件&#xff0c;获取尺寸&#xff0c;并创建截面视图。 下载最新版CST CAD Navigatorhttps://www.evget.com/p…

全网最全的接口文档速成

文章目录 接口文档内容前言1. 前后端分离开发1.1 介绍1.2 开发流程1.3 前端技术栈 2. Yapi2.1 介绍2.2 使用2.2.1 准备2.2.2 定义接口2.2.3 导出接口文档2.2.4 导入接口文档 3. Swagger3.1 介绍3.2 使用方式3.3 查看接口文档3.4 常用注解3.4.1 问题说明3.4.2 注解介绍3.4.3 注解…

Redis实战—秒杀优化(Redis消息队列)

回顾 我们回顾一下前文下单的流程&#xff0c;当用户发起请求&#xff0c;此时会请求nginx&#xff0c;nginx会访问到tomcat&#xff0c;而tomcat中的程序&#xff0c;会进行串行操作&#xff0c;分成如下几个步骤。 1、查询优惠卷 2、判断秒杀库存是否足够 …

文献笔记|综述|When Large Language Model Meets Optimization

When Large Language Model Meets Optimization 题目&#xff1a;当大型语言模型遇到优化时 作者&#xff1a;Sen Huang , Kaixiang Yang , Sheng Qi and Rui Wang 来源&#xff1a;arXiv 单位&#xff1a;华南理工大学 文章目录 When Large Language Model Meets Optimization…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知&#xff0c;今年8月1日&#xff0c;CISA新版考纲正式上线&#xff0c;旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版&#xff0c;中文版尚未发布。我们艾威经验丰…

Jetson-AGX-Orin多网卡绑定网卡名

Jetson-AGX-Orin多网卡绑定网卡名 ​ Jetson-AGX-Orin当通过USB接口或者Type-C口插入网卡设备后&#xff0c;重新上电Orin设备后&#xff0c;网卡设备的网卡名与Orin本身的以太网网卡名会发生交换。导致两个网卡设备配置发生错乱&#xff0c;两个网卡都将不通。 可以通过将网…

出道即包揽多项荣誉,Shokz韶音OpenFit Air拿下日本VGP金奖

说到盛夏的日本&#xff0c;你会想到什么&#xff1f;花火大会&#xff1f;但对于消费电子行业来讲&#xff0c;日本每年发布的VGP Summer奖项&#xff0c;才是每年盛夏时节行业内最大的庆典。而在今年的VGP 2024 Summer评选中&#xff0c;Shokz韶音在今年4月份刚发布的开放式耳…