ES6 Class(类) 总结(九)

news/2024/9/17 11:33:52/ 标签: es6, javascript, 前端

ES6 中的 class 是一种面向对象编程的语法糖,提供了一种简洁的方式来定义对象的结构和行为。

JavaScript 语言中,生成实例对象的传统方法是通过构造函数。下面是一个例子。

javascript">function Point(x, y) {this.x = x;this.y = y;
}
Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')';
};
var p = new Point(1, 2);

基本上,ES6 的 class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用 ES6 的 class 改写,就是下面这样:

javascript">class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}
}

ES6 的类,完全可以看作构造函数的另一种写法:

javascript">class Point {// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true----------------------------------------------------------------------------
class Point {constructor() {// ...}toString() {// ...}toValue() {// ...}
}
// 等同于
Point.prototype = {constructor() {},toString() {},toValue() {},
};

主要特性:

1. 声明式语法:使用 class 关键字声明类。
2. 构造函数:使用 constructor 方法初始化类实例。
3. 实例方法:定义在类内部的普通方法,使用 this 访问实例属性。
4. 静态方法:使用 static 关键字定义,不依赖于类的实例。
5. 实例属性:在构造函数中初始化,或使用字段声明语法(目前是 Stage 3 proposal)。
6. 继承:使用 extends 关键字实现。
7. super 关键字:在子类的构造函数中调用父类的构造函数或方法。
8. getter 和 setter:使用 get 和 set定义属性的访问器。
9. 私有属性和方法:使用 # 定义私有属性和方法(目前是 Stage 3 proposal)。

1. 基本类定义和实例化

javascript">class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return `Point(${this.x}, ${this.y})`;}
}let point = new Point(10, 20);
console.log(point.toString()); // 输出: Point(10, 20)

2. 静态方法、属性

javascript">class MathUtils {constructor() {console.log(MyClass.myStaticProp); // 42}static add(a, b) {return a + b;}static myStaticProp = 42;
}console.log(MathUtils.add(1, 2)); // 输出: 3

3. 继承和 super

javascript">class Rectangle {constructor(width, height) {this.width = width;this.height = height;}area() {return this.width * this.height;}
}class Square extends Rectangle {constructor(sideLength) {super(sideLength, sideLength);}
}let square = new Square(5);
console.log(square.area()); // 输出: 25

4. getter 和 setter

javascript">class Rectangle {constructor(width, height) {this.width = width;this.height = height;}get area() {return this.width * this.height;}set width(newWidth) {if (newWidth > 0) {this.width = newWidth;} else {console.log("Width must be positive.");}}
}let rect = new Rectangle(4, 5);
console.log(rect.area); // 输出: 20
rect.width = -10; // 输出: Width must be positive.

class的注意点

(1)严格模式

类和模块的内部,默认就是严格模式,所以不需要使用 use strict 指定运行模式。只要你的代码写在类或模块之中,就只有严格模式可用。考虑到未来所有的代码,其实都是运行在模块之中,所以 ES6 实际上把整个语言升级到了严格模式。

(2)不存在提升

类不存在变量提升(hoist),这一点与 ES5 完全不同。

javascript">new Foo(); // ReferenceError
class Foo {}//不会报错
//因为 Bar 继承 Foo 的时候, Foo 已经有定义了。
//但是,如果存在 class 的提升,上面代码就会报错,
//因为 class 会被提升到代码头部,而 let 命令是不提升的,
//所以导致 Bar 继承 Foo 的时候, Foo 还没有定义。
{let Foo = class {};class Bar extends Foo {}
}

(3)name 属性

由于本质上,ES6 的类只是 ES5 的构造函数的一层包装,所以函数的许多特性都被Class继承,包括 name 属性。

javascript">class Point {}
Point.name // "Point"
//name 属性总是返回紧跟在 class 关键字后面的类名。

(4)Generator 方法

如果某个方法之前加上星号( * ),就表示该方法是一个 Generator 函数。

javascript">class Foo {constructor(...args) {this.args = args;}* [Symbol.iterator]() {for (let arg of this.args) {yield arg;}}
}
for (let x of new Foo('hello', 'world')) {console.log(x);
}
// hello
// world//Foo 类的 Symbol.iterator 方法前有一个星号,表示该方法是一个 Generator 函数。 
//Symbol.iterator 方法返回一个 Foo 类的默认遍历器, for...of 循环会自动调用这个遍历器。

(5)this 的指向

类的方法内部如果含有 this ,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

javascript">class Logger {printName(name = 'there') {this.print(`Hello ${name}`);}print(text) {console.log(text);}
}
const logger = new Logger();
const { printName } = logger;
printName(); // TypeError: Cannot read property 'print' of undefined

避免使用this,在构造方法中绑定 this:

javascript">class Logger {constructor() {this.printName = this.printName.bind(this);}// ...
}

避免使用this,使用箭头函数:

javascript">class Obj {constructor() {this.getThis = () => this;}
}
const myObj = new Obj();
myObj.getThis() === myObj // true

避免使用this,使用 Proxy

javascript">function selfish (target) {const cache = new WeakMap();const handler = {get (target, key) {const value = Reflect.get(target, key);if (typeof value !== 'function') {return value;}if (!cache.has(value)) {cache.set(value, value.bind(target));}return cache.get(value);}};const proxy = new Proxy(target, handler);return proxy;
}
const logger = selfish(new Logger());

http://www.ppmy.cn/news/1474542.html

相关文章

【ARMv8/v9 GIC 系列 5.8 -- SPI 中断路由到指定的 core 详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 SPI 中断路由配置寄存器字段代码示例Usage scenarioSPI 中断路由配置 在ARMv8和ARMv9架构下,当启用亲和性路由(Affinity Routing)时,系统寄存器GICD_IROUTER<n>用于提供具有INTID n的SPI的路由信息。n的最大值由公式(32*…

精益化供应链,或许才是丰田的核心竞争力!

在汽车产业这个竞争激烈的战场上&#xff0c;丰田总能凭借其卓越的品质和高效的生产能力独领风骚。而在这背后&#xff0c;一个鲜为人知的秘密武器——精益化供应链&#xff0c;正是丰田能够长期保持领先地位的核心竞争力。 一、精益化供应链 丰田的精益化供应链管理理念&…

react 组件通信 —— 父子传值 【 函数式/类式 】

1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…

MybatisPlus 一些技巧

查询简化 SimpleQuery 有工具类 com.baomidou.mybatisplus.extension.toolkit.SimpleQuery 对 selectList 查询后的结果进行了封装&#xff0c;使其可以通过 Stream 流的方式进行处理&#xff0c;从而简化了 API 的调用。 方法 list() 支持对一个列表提取某个字段&#xff…

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护&#xff1a; 使用Docker搭建集群使用Hado…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案&#xff08;一&#xff09;使用合适的事务隔离级别&#xff08;二&#xff09;使用合适的锁机制&#xff08;三&#xff09;处理死锁&#xff08;四&#xff09;使用索引和约束&#xff08;五&#xff09;批…

如何在 Objective-C 中实现多态性,并且它与其他面向对象编程语言的多态性实现有何差异?

在Objective-C中&#xff0c;多态性可以通过使用父类的指针来调用子类的方法来实现。具体来说&#xff0c;可以定义一个父类的指针&#xff0c;然后将子类的实例赋值给这个指针。这样&#xff0c;即使使用父类的指针来调用方法&#xff0c;实际上会调用子类的方法。 需要注意的…

2024.7.11 刷题总结

2024.7.11 **每日一题** 2972.统计移除递增子数组的数目 Ⅱ&#xff0c;这道题和昨天的前置题目思路完全一样&#xff0c;只是数据范围变大了。我们还是先处理最大上升前缀&#xff0c;并且加上答案。然后从最后一个元素开始遍历&#xff0c;直到出现非下降元素就终止&#xff…

Elon Musk开源Grok

转载自&#xff1a;AILab基地 早在6天前&#xff0c;马斯克就发文称xAI将开源Grok 图片 13小时前&#xff0c;马斯克开源了旗下公司X的Grok训练模型&#xff0c;并喊话OpenAI&#xff0c;你名字里的Open到底在哪里 图片 下面是xai-org的GitHub开源地址[https://github.com/x…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素&#xff08;COOH-PEG-Biotin&#xff09;是一种常见的生物分子聚合物&#xff0c;具有多种应用&#xff0c;特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析&#xff1a; 一、基本信息 名称&#xff1a;羧基聚乙二醇生物素&#x…

钉钉扫码登录第三方

钉钉文档 实现登录第三方网站 - 钉钉开放平台 (dingtalk.com) html页面 将html放在 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>登录</title>// jquery<script src"http://code.jqu…

网络(一)——初始网络

文章目录 计算机网络的背景网络发展认识 "协议" 网络协议初识协议分层网络分层 网络传输基本流程数据包封装和分用网络中的地址管理认识IP地址认识MAC地址 计算机网络的背景 网络发展 独立模式:计算机之间相互独立 在最早的时候&#xff0c;计算机之间是相互独立的&…

EasyExcel文档链接与使用示例

文档链接 注解 https://blog.csdn.net/estelle_belle/article/details/134508223 官方文档地址 https://github.com/alibaba/easyexcel/tree/master?tabreadme-ov-file 使用示例 依赖版本 <dependency><groupId>com.alibaba</groupId><artifactId>…

【爬虫入门知识讲解:xpath】

3.3、xpath xpath在Python的爬虫学习中&#xff0c;起着举足轻重的地位&#xff0c;对比正则表达式 re两者可以完成同样的工作&#xff0c;实现的功能也差不多&#xff0c;但xpath明显比re具有优势&#xff0c;在网页分析上使re退居二线。 xpath 全称为XML Path Language 一种…

玄机——第五章 linux实战-黑链 wp

文章目录 一、前言二、概览简介 三、参考文章四、步骤&#xff08;解析&#xff09;准备步骤#1.0步骤#1.1找到黑链添加在哪个文件 flag 格式 flag{xxx.xxx} 步骤#1.2webshell的绝对路径 flag{xxxx/xxx/xxx/xxx/} 步骤#1.3黑客注入黑链文件的 md5 md5sum file flag{md5} 步骤#1.…

Mysql LIKE什么时候走索引,什么时候不走索引

在 MySQL 中&#xff0c;LIKE 查询是否走索引&#xff0c;主要取决于通配符的位置和使用的存储引擎。 使用索引的情况 前缀匹配&#xff1a; 当 LIKE 查询中的通配符出现在字符串的末尾时&#xff0c;查询可以利用索引。例如&#xff0c;LIKE abc% 。这种情况下&#xff0c;索…

如何使用Python正则表达式解析多行文本

使用 Python 的正则表达式来解析多行文本通常涉及到使用多行模式&#xff08;re.MULTILINE&#xff09;和 re.DOTALL 标志&#xff0c;以及适当的正则表达式模式来匹配你想要提取或处理的文本块。以下是一个简单的示例&#xff0c;展示了如何处理多行文本&#xff1a; 1、问题背…

基于EMQX+Flask+InfluxDB+Grafana打造多协议物联网云平台:MQTT/HTTP设备接入与数据可视化流程(附代码示例)

摘要: 本文深入浅出地介绍了物联网、云平台、MQTT、HTTP、数据可视化等核心概念&#xff0c;并结合 EMQX、Flask、InfluxDB、Grafana 等主流工具&#xff0c;手把手教你搭建一个支持多协议的物联网云平台。文章结构清晰&#xff0c;图文并茂&#xff0c;代码翔实易懂&#xff0…

MySQL 数据库的 DDL

备份 MySQL 数据库的 DDL&#xff08;数据定义语言&#xff09;语句包括导出数据库结构&#xff08;如表、视图、触发器、存储过程和函数等&#xff09;&#xff0c;但不包括实际数据。通常使用 mysqldump 工具进行此类操作。以下是具体的方法&#xff1a; 备份 DDL 1. 导出数…

免费的AI文生视频哪些比较靠谱?

目前市场上推出了很多文生图&#xff0c;图生视频等各类AI工具网站&#xff0c;但实际上效果如何呢&#xff1f; 可以说&#xff0c;进步很大。从无到有&#xff0c;从有到精&#xff0c;毕竟需要一个时间阶段的。 国内的文生视频大部分都直接需要付费&#xff0c;不付费的比…