javascript中的class基础入门(1)

javascript中的class

start

  • 最近在学习:cocos ,准备自己制作小游戏。过程中遇到不少疑问,我计划将这些疑问写成一个系列博客,用以记录。
  • 这篇文章来了解 class

1. 前言

1. 前言

  1. 本文对应版本 Cocos Creator 3.8
  2. Cocos Creator3.x编写脚本的语言是 TypeScript,在了解 TypeScript 中的语法之前,我们先掌握 javascript 中的 class
  3. 后面为了方便描述,javascript 我简称为 jsTypeScript 简称为 ts

ts 可以理解为是具有类型语法的js,用大白话说,ts 是基于 js,扩充了类型语法。

  1. 本文仅对 class 主要内容进行说明,更详细说明可参考 阮一峰-ECMAScript 6 入门-class基础语法

2. class 基础介绍

2.1 如何定义class?

// 直接使用 class 关键词定义即可
class Point {}

注意事项:

  1. class 小写;
  2. Point 也就是类名,按规范推荐首字母大写;
  3. 和定义函数不同,定义类,类名后不需要增加小括号;

2.2 如何使用class?

定义一个 class ,结合 new 关键词我们可以创建一个对象(创建出来的对象,我们叫它:实例对象

比如:

class Point {}var p = new Point()
// p 就是一个实例对象

2.3 class 可以看做 es5 中构造函数写法的语法糖

js 中创建实例对象,是有两种方式:

  1. 在早期的代码中,往往会通过构造函数的方式去实现。
  2. 在 es6 中,引入了 class 关键词,通过 class 实现。

class 的绝大部分功能,ES5 都可以做到。因此为了加深印象,在学习 class 关键词的时候,相同代码,我会列出 ES5 中如何实现的。

es6中的“类”

class Point {constructor(x, y) {this.x = x;this.y = y;}toString() {return '(' + this.x + ', ' + this.y + ')';}
}var p = new Point(1, 2)

es5中的“类”

function Point(x, y) {this.x = xthis.y = y
}Point.prototype.toString = function () {return '(' + this.x + ', ' + this.y + ')'
}var p = new Point(1, 2)// 构造函数的形式

在这里插入图片描述

注意事项:

  1. 直接对类使用 new 命令,跟构造函数的用法完全一致;
  2. 类的所有方法都定义在类的 prototype 属性上面

3. class 中的 constructor() 方法

3.1 基础说明

  • constructor() 方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法。

自动调用constructor

  • 一个类必须有 constructor() 方法,如果没有显式定义,一个空的constructor()方法会被默认添加。

  • constructor()方法默认返回实例对象(即this)。除了默认对象,也可以指定返回另外一个对象。

constructor返回非默认对象

3.2 个人理解

简单来说,constructor 对标 ES5 中的构造函数。我们可以在 constructor ,定义 new 输出的实例对象。classconstructor 必须要有,不写会默认添加。

如下图:

基础的类实现方式 es5-class

4. class 中定义的属性和方法

4.1 实例属性

由上文得知,我们定义实例对象上的属性,需要在 constructor 定义。ES2022为类的实例属性,又规定了一种新写法。

如下:

写法一

// 原来的写法
class Demo {constructor() {this._count = 0;}add() {this._count++;}
}var d = new Demo()
console.log(d) // { _count: 0 }

写法二

// 新的写法
class Demo {_count = 0 // _count会绑定在实例对象上add() {this._count++}
}var d = new Demo()
console.log(d) // { _count: 0 }

这样写,好处非常明显,定义实例对象的属性的时候,可以更加简洁明了。

ps: Cocos Creator3.x 中定义实例属性,就是使用的 写法二 ,更加简洁明了。

注意事项

  • 实例属性顾名思义,定义的属性是实例对象自身的属性,而不是定义在实例对象的原型上面。(参考上方的示例代码。实例属性对应:d上的属性,而不是 Demo.prototype上的属性)

4.2 class中定义的方法

和实例属性不同,class 中直接定义的函数,是定义在实例对象的原型对象上,如下图示例。

在这里插入图片描述

为什么属性和方法有这样的不同?为什么要这么做?

  1. js 中当我们试图访问一个对象的属性时,如果该对象本身没有这个属性,那么 js 会在对象的原型对象上查找这个属性,依次类推,直到找到属性或者达到原型链的顶端。

    这样就保证了我们的函数定义在实例对象的原型上,实例对象是可以访问,调用的。

  2. 所有的实例都可以共享同一个方法,而不是每个实例都存储一份方法的副本。这种做法可以节省内存。

  3. 将方法放在原型上,我们还可以实现方法的继承和重写。子类可以通过在其原型上添加或重写父类的方法来实现继承或重写。

注意事项

  • class 中直接定义的函数,实际上是定义在实例对象的原型对象上

5. 取值函数(getter)和存值函数(setter)

“类”的内部可以使用getset关键字,对某个属性设置存值函数取值函数拦截该属性的存取行为。

5.1 如何定义?

class MyClass {constructor() {// ...}get prop() {return 'getter';}set prop(value) {console.log('setter: '+value);}
}let inst = new MyClass();inst.prop = 123;
// setter: 123inst.prop
// 'getter'// prop是一个属性,通过 `get`和`set`关键字,拦截 prop 的存取。
// 能拦截属性的存取,就可以根据我们自身的需求去增加逻辑

7. 静态方法和静态属性 static

函数其实本身也是一个对象,而class定义的类,其实也是一个对象。这个对象本身,是可以存储属性的。这些属性我们就叫它静态方法和静态属性

class 中,为了方便定义一个静态属性,我们可以在属性前,增加关键词 static 用以表示。

ES5 中定义静态方法

function Point(x, y) {}Point.like = 'lazyTomato'Point.say = function () {console.log('我是say方法')
}

ES6 中 class 旧版的定义静态方法

class Point {}
Point.like = 'lazyTomato'
Point.say = function () {console.log('我是say方法')
}

ES6 中 class 使用static关键词定义静态方法

class Point {static like = 'lazyTomato'static say() {console.log('我是say方法')}
}

注意事项:

  1. static 定义的就是静态属性和静态方法;
  2. 因为静态属性和静态方法,直接定义在 class 上的属性和方法,所以可以不用实例化直接调用。

8. 私有属性和私有方法

有时候,我们定义在类上的属性或者方法,仅供类内部使用,不希望被实例对象调用。

这个时候就出现了希望能私有这些属性和方法的方式。

私有,可以理解为就是仅供内部使用。

8.1 早期的实现方式:

class Point {_conut:1_say() {console.log('不希望被实例对象调用的方法')}
}// 通过给属性或者方法增加 `_` (下划线),表示这个属性或者方法是私有的。
// 但是这个方式并不是百分百保险的,外部还是可以调用。

8.2 利用 Symbol 值的唯一性:

const bar = Symbol('bar');
const snaf = Symbol('snaf');export default class myClass{// 公有方法foo(baz) {this[bar](baz);}// 私有方法[bar](baz) {return this[snaf] = baz;}// ...
};

但是使用 Reflect.ownKeys() 依然可获取到这些属性。

const inst = new myClass();Reflect.ownKeys(myClass.prototype)
// [ 'constructor', 'foo', Symbol(bar) ]

8.3 使用 ES6中的

class Foo {#a;#b;constructor(a, b) {this.#a = a;this.#b = b;}#sum() {return this.#a + this.#b;}printSum() {console.log(this.#sum());}
}

9.总结

9.1 总结一下 class 中的一些属性:

名称定义在哪里示例
实例属性实例对象在这里插入图片描述
class中定义的函数定义在实例对象的原型对象上在这里插入图片描述
get和set函数实例对象在这里插入图片描述
静态方法和静态属性类自身在这里插入图片描述
私有属性和私有方法类内部在这里插入图片描述

9.2 不同的属性在谷歌浏览器中的展示效果

1.实例属性,红色高亮

在这里插入图片描述

2.class中定义的函数:红色偏灰

在这里插入图片描述

3.get和set方法:红色更加灰

在这里插入图片描述

4.静态属性和静态方法

在这里插入图片描述

5.私有属性和私有方法

在这里插入图片描述

9.3 为什么 class 中有些属性可以直接通过 this 调用

示例代码一

class Point {num = 1say() {console.log('我是say方法')}test() {console.log(this.num) // 问题1console.log(this.say()) // 问题2}
}

把上面的代码换一种写法

示例代码二

class Point {constructor() {this.num = 1}say() {console.log('我是say方法')}test() {console.log(this.num) // 问题1console.log(this.say()) // 问题2}
}
var p = new Point()
p.test()
问题1: 为什么可以调用 this.num ?

因为谁调用函数,函数this就指向谁,执行 p.test()this 指向 pp 本身有一个 num 属性,所以可以正常调用。

问题2: 为什么可以调用 this.say()?

执行 p.test()this 指向 pp 本身没有 say 方法,但是它原型链上存在,所以可以正常调用。

end

  • 目前就class的基础内容就介绍到这里了。
  • 后续再补充 子类,继承 等内容。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

mysql-Synch-clickhouse

Synch GitHub - long2ice/synch: Sync data from the other DB to ClickHouse(cluster) 环境: mysql5.7 redis > 5.0 clickhouse21.2 postgresql python3 binlog_formatrow XREAD default pg_config synch 1:安装clickhouse rpm下载地址&…

今日arXiv最热大模型论文:点击即可播放!港中文发布大模型写歌神器!

一首歌,包含作词作曲两个部分。擅长作词or作曲就已经很牛了。比如方文山是周杰伦的御用作词人,而周杰伦写过很多耳熟能详的曲子。而兼具作词作曲才华的全能创作人却是难得一见。 最近港中文发布了一款歌曲创作大模型SongComposer,作词作曲都…

DiskMirror-spring-boot-starter 技术|

DiskMirror-spring-boot-starter 技术 diskMirror 实现了 SpringBoot 的 starter 能够集成到 SpringBoot 中。 DiskMirror 的 starter,通过引入此类,可以直接实现 diskMirror 在 SpringBoot 中的自动配置,接下来我们将使用案例逐步的演示 d…

飞腾平台编译安装openGauss数据库

1. 环境检查 1.1 检查OS版本 openGauss支持的操作系统: CentOS 7.6(x86_64 架构)openEuler-20.03-LTS(aarch64 架构)openEuler-20.03-LTS(x86_64架构)Kylin-V10(aarch64 架构&…

作业1-224——P1015 [NOIP1999 普及组] 回文数

题目描述 思路 首先此题为一道高精度题,然后本题按照题目意思模拟即可。我们可以开两个数组来记录高精度数字,这样方便我们处理。判断“该数组是否回文”、“c翻转存入d再做cd”可以写成两个单独的函数。然后主程序组织一下他们即可。注意好退出循环的…

String类的使用

String常用的构造方法 String的源码 内部是一个数组和hash值,涉及到常量池后续补充(常量池:存储相同的字符时只会存储一租) String的比较 equals()与:String里面为我们提供了许多方法,可直接调用&#xf…

electron 项目环境变量使用注意 public

问题 最近项目中,electron需要调用唤醒本地的另一个客户端程序,但是这个客户端程序报错了。sqlite3 报out of memory. apiSHGetFolderPathW 获取CSIDL_COMMON_DOCUMENTS报 1008,试图引用不存在的令牌。 排查 一看到这个,首先想…

苍穹外卖Day03——解决总结3中存在的问题

解决Day03中存在的问题 1. ResponseBody 与 RequestBody2. RequestParam 与 PathVariable3. 字段填充技术(注解、AOP、反射)3.1. AOP3.2. 注解3.3. 反射3.5 字段填充在项目应用 4. 阿里云云存储OOS 1. ResponseBody 与 RequestBody ResponseBody&…

varFormatter 数据格式化库 以性能优先的 快速的 内存对象格式转换

varFormatter 数据格式化 技术 开源技术栏 对象/变量格式化工具库,其支持将一个对象进行按照 JSON XML HTML 等格式进行转换,并获取到结果字符串! 目录 文章目录 varFormatter 数据格式化 技术目录介绍获取方式 使用实例格式化组件的基本使…

WIN10 无密码自动登录

1、家里重装了一下WIN10系统,第一次登陆居然用了微软网站账号,结果密码忘记了,后面只能用PIN码登陆系统。 2、需要登录微软的网站修改密码: Microsoft account | Sign In or Create Your Account Today – Microsoft 3、在运行…

【C语言】动态内存管理常用函数

前言 我们在之前学习的数组开辟的空间是固定不变的,有时候我们需要的空间⼤⼩在程序运⾏的时候才能知道~ c语言中的动态内存开辟,让程序员⾃⼰可以根据实际需求申请和释放相应空间,这使得空间的开辟变得灵活了许多。 欢迎关注个人主页&#x…

数据库原理及应用 第三章:关系数据模型

文章目录 三、关系数据模型3.1.1关系模型概述3.1.2候选键和外键3.2关系模型的完整性 三、关系数据模型 3.1.1关系模型概述 3.1.2候选键和外键 3.2关系模型的完整性

写作软件,批量写作文章的软件

在信息爆炸的时代,写作软件成为许多人提高效率、优化内容的利器。本文将介绍6款不同的写作软件,以及知名的147GPT生成工具和文心一言AI生成软件,它们不仅可以帮助用户快速生成原创文章,还支持全自动SEO优化,提升文章在…

wy的leetcode刷题记录_Day79

wy的leetcode刷题记录_Day79 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间:2024-3-1 前言 目录 wy的leetcode刷题记录_Day79声明前言2369. 检查数组是否存在有效划分题目介绍思路代码收获 61. 旋转链表题目介绍思路代码收获 82. 删除排…

【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...

报错如下 根目录添加 .env.local 文件 .env.local :本地运行下的配置文件 配置:VUE_GITHUB_USER_NAME 及 VUE_APP_SECRET_KEY 原因

【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑窗口Debug

目录 前言 行断点 条件断点 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时,如果能确定大致的代码段,就可以在相应的行上设置一个断点(Breakpoint)&…

Oracle 11g升级19c 后部分查询功能很慢

*Oracle 11g升级19c 后部分查询功能很慢 今天生产突然有个查询非常慢,日志显示执行了50秒左右,但是从日志中拿出SQL在PLSQL执行,发现用时不到1秒,查看SQL,怀疑是下面几种原因导致 1、使用函数不当 UNIT.UNIT_CODE LIKE CONCAT(‘…

b站小土堆pytorch学习记录——P7-P8 Tensorboard的使用

文章目录 一、前置知识1.Tensorboard是什么2.SummaryWriter3.add_scalar()4.add_image() 二、代码1.一次函数2.蚂蚁和蜜蜂图片 一、前置知识 1.Tensorboard是什么 TensorBoard 是 TensorFlow 的可视化工具,它允许开发者可视化模型的图(graph&#xff0…

栈(顺序栈)实现Language C

###王道考研的学习领悟,个人喜好讲解清晰 何为栈? 定义:栈(stack)是只允许在一端进行插入或删除的线性表。 其重要术语:栈顶,栈底,空栈。 我们只需要把这个图看明白了,理解起来就…

electron+vue3全家桶+vite项目搭建【28】封装窗口工具类【2】窗口组,维护窗口关系

文章目录 引入实现效果思路主进程模块渲染进程模块测试效果 引入 demo项目地址 窗口工具类系列文章: 封装窗口工具类【1】雏形 我们思考一下窗口间的关系,窗口创建和销毁的一些动作,例如父子窗口,窗口组合等等,还有…