js 类、原型及class
js 一直允许定义类。ES6新增了相关语法(包括class关键字)让创建类更容易。新语法创建的类和老式的类原理相同。js 的类和基于原型的继承机制与Java等语言中的类和继承机制有着本质区别。
1 类和原型
类意味着一组对象从同一个原型对象继承属性。因此,原型对象是类的核心特征。
用工厂函数创建和初始化该类的新实例:
function range(from, to) {let r = Object.create(range.methods);r.from = from;r.to = to;return r;
}range.methods = {includes(x) {return this.from <= x && x <= this.to;},*[Symbol.iterator]() {for (let x = Math.ceil(this.from); x <= this.to; x++)yield x;},toString() {return "(" + this.from + "..." + this.to + ")";},}let r = range(1,3);
console.log(r.includes(2));
console.log(r + ""); // 调用的是toString()方法
console.log(r); // 打印对象本身,而非调用toString()方法
console.log([...r])
2 类和构造函数
只有函数(不包括箭头函数、生成器函数和异步函数)对象才有prototype属性。
上面定义类的写法非习惯写法,因为它没有定义构造函数。构造函数要使用new关键字调用,会自动创建新对象,因此构造函数本身只需初始化新对象的状态。构造函数调用的关键在于构造函数的prototype属性将被用作新对象的原型。
function Range(from,to) {this.from = from;this.to = to;
}// 原型属性名必须命名为prototype
Range.prototype = {includes(x) {return this.from <= x && x <= this.to;},*[Symbol.iterator]() {for (let x = Math.ceil(this.from); x <= this.to; x++)yield x;},toString() {return "(" + this.from + "..." + this.to + ")";}
}let r = new Range(1,3);
console.log(r.includes(2));
console.log(r + "");
console.log(r)
console.log([...r])
2.1 instanceof
当且仅当两个对象继承同一个原型对象时,它们才是同一个类的实例。instanceof 操作符用于检查某个对象是否是某个特定类的实例。
严格来讲,instanceof操作符并非检查对象是否通过某个构造函数初始化,而是检查对象是否继承了原型。(不一定是直接继承)
let prototype = {}function Person() {}function Animal() {}let p = new Person();console.log( p instanceof Person); // true
console.log( p instanceof Animal); // falsePerson.prototype = prototype
Animal.prototype = prototypelet p2 = new Person()
console.log( p2 instanceof Person); // true
console.log( p2 instanceof Animal); // true
2.2 constructor 属性
prototype属性的值是一个对象,其有一个不可枚举的constructor属性,该属性的值就是prototype所属的函数对象:
let F = function() {};
let p = F.prototype;
let c = p.constructor;
c === F; //true
3 使用class关键字定义类
class关键字是在ES6才引入的。
使用class来定义类:
class Person {constructor(age) {this.age = age;}showAge() {console.log(this.age);}}let p = new Person(12);
p.showAge();let Animal = class {constructor(name) {this.name = name}showName() {console.log(this.name)}
}let a = new Animal("大象");
a.showName()
与函数声明不同,类声明不会“提升”(函数定义就像是会被提升到包含文件或包含函数顶部一样,而类声明不会)。
类声明除了语句到形式外,还有表达式的形式。不过这种形式并不常用:
let Persopn = class { constructor() {} }
3.1 静态方法
在class体中,把static关键字放在方法声明前面可以定义静态方法。静态方法是作为构造函数而非原型的属性定义的。
class Person {static hello() {console.log("hello word")}
}Person.hello(); // hello word
let p = new Person();
p.hello(); // 报错,p.hello is not a function
静态函数必须通过构造函数而非实例调用。
3.2 获取和设置方法
在class 体内,可像对象字面量中一样定义获取方法和设置方法,唯一的区别是类体内的方法后面不加逗号。
class Person {set age(val) {if (val <= 0) throw new TypeError("年龄不能小于0")this.age = val}
}let person = new Person();
person.age = -1
console.log(person.age)
4 子类
ES6之前定义子类的方式是通过原型,ES6则通过extends定义子类。
4.1 子类与原型
function Person() {console.log("Person的构造器")
}Person.prototype = {constructor: Person,showType() {console.log("Person")}
}function Man() {console.log("Man的构造器")
}Man.prototype = Object.create(Person.prototype)
let man = new Man();
man.showType()
console.log(man.constructor)Man.prototype.constructor = Man
console.log(man.constructor)
只有在知道父类实现细节的前提下才可能这样定义子类,健壮的子类化机制应该允许类调用父类的方法和构造函数,在ES6之前,js中没有简单的方法做到这些。
4.2 通过extends和super创建子类
class Person {constructor() {console.log("Person:" + new.target)}
}class Man extends Person {constructor() {super();console.log(this)console.log("Man")}
}class Woman extends Person {constructor() {super();console.log("Woman")}
}let man = new Man();
let woman = new Woman()
注意事项:
1)使用extends关键字定义了一个类,则该类的构造函数必须使用super()调用父类构造器。
2)在通过super()调用父类构造器之前,不能在构造器中使用this关键字。
3)new.target引用的是被调用的构造函数。
在实际开发中,并不建议创建很多子类,建议通过“组合”的方式来替代继承。
相关文章:
js 类、原型及class
js 一直允许定义类。ES6新增了相关语法(包括class关键字)让创建类更容易。新语法创建的类和老式的类原理相同。js 的类和基于原型的继承机制与Java等语言中的类和继承机制有着本质区别。 1 类和原型 类意味着一组对象从同一个原型对象继承属性。因此,原型对象是…...
day-30 代码随想录算法训练营 回溯part06
332.重新安排行程 思路:使用unordered_map记录起点机场对应到达机场,内部使用map记录到达机场的次数(因为map会进行排序,可以求出最小路径) class Solution { public:vector<string>res;unordered_map<stri…...
txt、pcd、las、ply 格式点云基本的读写和显示 (附 python c++ 代码)
一、文本(txt) 1.1、存储结构 使用文本格式存储的点云数据文件结构比较简单,每个点是一行记录,点的信息存储格式为 x y z或者 x y z r g b。 1.2、读取 读取文本格式的点云数据时,可以按照一般的文本读取方法,这里记录一下如何使用open3d读取txt格式的点云数据 impo…...
k8s节点pod驱逐、污点标记
一、设置污点,禁止pod被调度到节点上 kubectl cordon k8s-node-145 设置完成后,可以看到该节点附带了 SchedulingDisabled 的标记 二、驱逐节点上运行的pod到其他节点 kubectl drain --ignore-daemonsets --delete-emptydir-data k8s-node-145 显示被驱逐…...
【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手
文章目录 4.17 TCP三次握手4.18滑动窗口4.19TCP四次挥手 4.17 TCP三次握手 TCP 是一种面向连接的单播协议,在发送数据前,通信双方必须在彼此间建立一条连接。所谓的“连接”,其实是客户端和服务器的内存里保存的一份关于对方的信息ÿ…...
茶叶小笔记
文章目录 茶叶的作用茶叶的主要成分茶多酚氨基酸(蛋白质)生物碱 茶叶的分类乌龙茶铁观音(安溪) 绿茶龙井(西湖)龙井43 绿茶(日照)毛尖(信阳毛尖)太平猴魁六安瓜片 红茶金骏眉大红袍 白茶云南白茶 黄茶黑茶花草茶 茶叶的形状过期茶的利用茶叶蛋大排档泡澡泡脚除湿除臭 茶渣的利用…...
安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计WebPack打包器第三方库JQuery安装使用安全检测
文章内容 环境搭建-NodeJS-解析安装&库安装安全问题-NodeJS-注入&RCE&原型链案例分析-NodeJS-CTF题目&源码审计打包器-WebPack-使用&安全第三方库-JQuery-使用&安全 环境搭建-NodeJS-解析安装&库安装 Node.js是运行在服务端的JavaScript 文档参考…...
Android JNI系列详解之CMake编译工具的使用
一、CMake工具的介绍 如图所示,CMake工具的主要作用是,将C/C编写的native源文件编译打包生成库文件(包含动态库或者静态库文件),集成到Android中使用。 二、CMake编译工具的使用 使用主要是配置两个文件:CM…...
springboot中关于继承WebMvcConfigurationSupport后自定义的全局Jackson失效解决方法,localdate返回数组问题
一般情况下我们在config里增加jackson的全局配置文件就能满足基本的序列化需求,比如前后端传参的问题。 Configuration public class JacksonConfig {public static final String LOCAL_TIME_PATTERN "HH:mm:ss";public static final String LOCAL_DATE…...
LeetCode 面试题 02.03. 删除中间节点
文章目录 一、题目二、C# 题解 一、题目 若链表中的某个节点,既不是链表头节点,也不是链表尾节点,则称其为该链表的「中间节点」。 假定已知链表的某一个中间节点,请实现一种算法,将该节点从链表中删除。 例如&#x…...
Redis知识点总结
概述 Redis诞生于2009年,全称是Remote Dictionarty Server(远程词典服务器) 只支持单线程 非关联:主要指的是表中没有主外键等概念 Redis是一款内存数据库,主要存储键值对类型的数据 基本用法 注意:该操作是在cli中进行的 键名…...
(四)k8s实战-服务发现
一、Service 1、配置文件 apiVersion: v1 kind: Service metadata:name: nginx-svclabels:app: nginx-svc spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议,支持 TCP、UDP、SCTP,默认为 TCPport: 80 # service 自己的…...
AxureRP制作静态站点发布互联网,内网穿透实现公网访问
AxureRP制作静态站点发布互联网,内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网,内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…...
[Go版]算法通关村第十四关白银——堆高效解决的经典问题(在数组找第K大的元素、堆排序、合并K个排序链表)
目录 题目:在数组中找第K大的元素解法1:维护长度为k的最小堆,遍历n-k个元素,逐一和堆顶值对比后,和堆顶交换,最后返回堆顶复杂度:时间复杂度 O ( k ( n − k ) l o g k ) O(k(n-k)logk) O(k(n−…...
『FastGithub』一款.Net开源的稳定可靠Github加速神器,轻松解决GitHub访问难题
📣读完这篇文章里你能收获到 如何使用FastGithub解决Github无法访问问题了解FastGithub的工作原理 文章目录 一、前言二、项目介绍三、访问加速原理四、FastGithub安装1. 项目下载2. 解压双击运行3. 运行效果4. GitHub访问效果 一、前言 作为开发者,会…...
软件开发的201个原则 阅读笔记 第172-201个原则
目录 原则172 做项目总结 第8章 产品保证原则 原则173 产品保证并不是奢侈品 原则 174 尽早建立软件配置管理过程 原则175 使软件配置管理适应软件过程 原则176 组织SCM 独立于项目管理 原则 177 轮换人员到产品保证组织 给所有中间产品一个名称和版本 原则179 控制基准 原则…...
vue 后台管理系统登录 记住密码 功能(Cookies实现)
安装插件 import Cookies from js-cookie 组件引入 import Cookies from js-cookie; 存值: Cookies.set(username, state.account, { expires: 30 }); // username 存的值的名字,state.account 存的值 expires 存储的时间,30天Cookies…...
elementUI moment 年月日转时间戳 时间限制
changeStartTime(val){debuggerthis.startT val// this.startTime parseInt(val.split(-).join())this.startTime moment(val).unix() * 1000 //开始时间毫秒if(this.endTime){this.endTime moment(this.endT).unix() * 1000 //结束时间毫秒if(this.startTime - this.endTi…...
用AI + Milvus Cloud搭建着装搭配推荐系统教程
以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…...
大数据领域都有什么发展方向
近年来越来越多的人选择大数据行业,大数据行业前景不错薪资待遇好,各大名企对于大数据人才需求不断上涨。 大数据从业领域很宽广,不管是科技领域还是食品产业,零售业等都是需要大数据人才进行大数据的处理,以提供更好…...
AI净界开箱即用:无需配置,上传图片秒出透明背景,亲测好用
AI净界开箱即用:无需配置,上传图片秒出透明背景,亲测好用 1. 产品核心价值 在电商设计、内容创作和数字营销领域,背景移除是最频繁却又最耗时的图像处理需求之一。传统方法要么需要专业软件技能,要么效果难以令人满意…...
跨平台核心工具集全场景部署指南:从环境适配到性能优化
跨平台核心工具集全场景部署指南:从环境适配到性能优化 【免费下载链接】coreutils 跨平台的 Rust 重写 GNU 核心工具集。 项目地址: https://gitcode.com/GitHub_Trending/co/coreutils 需求场景:打破系统壁垒的命令行工具统一方案 在多系统开发…...
SDMatte代码解读:关键模块架构分析与核心算法实现
SDMatte代码解读:关键模块架构分析与核心算法实现 1. 项目背景与核心价值 SDMatte是一个开源的图像抠图工具,基于深度学习技术实现高质量的自动背景分离。相比传统方法,它能够更准确地处理复杂边缘(如头发、透明材质等ÿ…...
华硕笔记本显示色彩配置异常问题解决指南
华硕笔记本显示色彩配置异常问题解决指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: https://gitcode.com/…...
常量和常量表达式1
一、基础定义(C/C通用核心定义) 1. 常量(Constant) 程序整个生命周期内值不可修改、固定不变的量,是值的实体(单个固定值/命名固定值),其值的确定时机可在编译期/预处理期࿰…...
UDS诊断协议详解与测试实践
📊 UDS诊断协议详解与测试实践> 深入讲解UDS(Unified Diagnostic Services)诊断协议,包括服务详解、测试方法和实际案例分析。—## 一、UDS协议概述### 1.1 什么是UDSUDS(Unified Diagnostic Services,统…...
C++ constexpr 在工程中的应用场景
C constexpr 在工程中的应用场景 在现代C开发中,constexpr关键字因其强大的编译时计算能力,逐渐成为提升性能与代码可维护性的利器。它允许开发者在编译期完成复杂的计算和初始化,从而减少运行时开销,同时增强代码的静态安全性。…...
四足机器人避坑指南:为什么你的仿生项目总站不稳?(附开源方案推荐)
四足机器人避坑指南:为什么你的仿生项目总站不稳? 在实验室里调试到凌晨三点,眼看着四足机器人又一次在转弯时摔得"四脚朝天"——这可能是很多机器人开发者共同的噩梦。从步态规划的逻辑漏洞到传感器数据的微妙偏差,从执…...
如何快速解密Navicat加密密码?这款开源工具让数据库连接迁移更简单
如何快速解密Navicat加密密码?这款开源工具让数据库连接迁移更简单 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 在数据库管理工作中&#…...
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程
零代码实现YouTube视频翻译:Hugging Face大语言模型实战教程 在全球化内容消费的今天,语言障碍成为许多人获取知识的隐形门槛。想象一下,当你发现一个精彩的英文技术讲座视频,却因为语言问题无法充分理解;或是需要将中…...
