大家好,我是若川。最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与。

前言

ES5中是原型函数,到了ES6中出现了"类"的概念。等同于是ES5的语法糖,大大提升了编写代码的速度,本文只讲一些常用的(其实也就那几个属性),下面就让我们来认识一下

基本使用

定义的关键字就是class,下面这样就是定义了一个,跟我们ES5构造函数一样,都是使用new关键字

class Person {}const cateory = new Person() // 调用 类

类继承

ES5中,我们要继承的话得使用call或者prototype来继承原型或者实例上的方法,但是在ES6中为我们提供了extends关键字直接使用就好,同样它会继承方法属性

class Person {name = "前端娱乐圈";hello() {return "你好"}
}class Scholl extends Person {getName() {return this.name;}
}const res = new Scholl();
console.log(res.getName()) // 前端娱乐圈
console.log(res.hello()) // 你好

constructor

constructor构造函数,它就是当前实例的构造函数。每一个类里面只能存在一个constructor,当实例化的时候(也就是new)constructor会立即执行。如果一个里面没有显示定义constructor构造函数的话,会默认隐式被添加进中并且返回值是当前,当然也可以显示手动return返回其它引用值,这时当前的实例就是constructor的返回值。

// 默认不写
class Person {
}
console.log(new Person()) // 默认constructor指向自己的实例// 显示写上constructor
class Person1 {constructor() {}
}
console.log(new Person1()) // 显示地写上constructor构造函数。实例对象返回当前的constructor// 显示的返回对象
class Person2 {constructor() {return {}}
}
console.log(new Person2()) // 这实例的返回值就是一个空对象,constructor返回值只有是对象才可以

super关键字

class Person {}class school extends Person {constructor() {super() // 这里继承了Person类,但是必须使用super调用,否则会报错。}
}

上面school类继承了Person类,如果不在constructor中调用super关键字那么它就会报错。因为子类没有自己的this对象,而是继承父类的this对象,这里的super关键字就是父类Person对象。最终实例化返回的是school实例,super函数 内部会Person.prorotype.constructor.call(this)

注意,super函数只能在类中执行一次,否则会报错

super关键字也可以当做一个对象使用

class Person {getName() {return "前端娱乐圈"}
}
Person.prototype.name = "蛙人"
Perosn.prototype.age = 18class school extends Person {constructor() {const res = super() // 这里的super指向Person类console.log(super.getName(), super.name) // 这里的super关键字指向Person.prototype}getAge() {console.log(super.age)}
}

上面代码中,super函数只能拥有一个,但super关键字可以当成一个对象使用,super关键字当成对象指向的是父类prototype原型对象。super关键字可以在类的任何地方使用,但super函数只能在constructor中使用。

注意:super函数返回值是当前类的实例,super关键字指向的当前类的prototype

get

用于获取取值属性,刚在上面我们说过,私有属性不能在类的外部访问,但是我们可以通过get关键字来获取类里面的私有属性

class Person {private username = "前端娱乐圈";private age = 18;get getVal() {return this.username;}
}
const res = new Person();
console.log(res.getVal) // 前端娱乐圈

那么我们来看一下,这个get关键字和定义一个方法有何不同。

class Person {private username = "前端娱乐圈";private age = 18;getVal() {return this.username;}
}
const res = new Person();
console.log(res.getVal()) // 前端娱乐圈

上面我们把get关键字去掉了,并且调用时候的带上了()代表要执行一个函数。虽然这样写跟get关键字效果是一样的,但是不推荐我们这么写,就像Vue中我们使用computed写,就不推荐methods里面写。官方定义的get取值函数,我们取值直接用get关键字就行也不用写(),就像获取一个属性一样。

set

set存值函数,上面说了get,那么有get就一定有set。存值函数跟取值函数一个意思,一个获取一个设置嘛。

class Person {private username = "前端娱乐圈";private age = 18;get getVal() {return this.username;}set setVal(val) {this.username = val}
}
const res = new Person();
res.setVal = "蛙人"
console.log(res.getVal()) // 蛙人

上面我们先执行了存值,然后在取值,跟我们预期的结果一样,我们存值改变了username,获取值也会改变。

私有属性

中私有属性必须以#开头声明,以#开头的只能在中访问,在的外部不能访问。如果用的TypeScript完全可以使用private代替。

class Person {#name = "蛙人"constructor() {}getName() {return this.#name}#getAge() {return 18}
}
const res = new Person();
// console.log(this.#name) // 报错,必须在封闭类中声明该字段
console.log(res.getName()) // 蛙人
console.log(res.#getAge) // 报错,getAge is not function

static

static的静态属性,"静态数据"是啥意思呢,就是不用实例化就可以访问的属性。像我们不是static定义的属性和方法都必须的实例化类才能调用。

这里需要注意一下,当我们定义完

非static定义的属性

class Person {username = "前端娱乐圈";age = 18;
}
const res = new Person().username; // 前端娱乐圈

像我们这种非static定义的属性,要想访问username属性就必须得实例化new才能访问。

static定义的属性

static定义的静态属性,就是不用实例化就可以直接访问。不定义在实例化对象上面。

// 之前老的写法
class Person {}
Person.username = "前端娱乐圈"// 新写法,加一个static关键字即可
class Person {static username = "前端娱乐圈";static age = 18;static getName() {return Person.username}
}console.log(Person123.username, Person123.getName()) // 前端娱乐圈,前端娱乐圈

之前老写法的静态属性定义在类的外部。整个类生成以后,再生成静态属性。这样让人很容易忽略这个静态属性,也不符合相关代码应该放在一起的代码组织原则。为了解决这问题,就新出的static关键字静态方法


以下这三个修饰符是在TypeScript类中才能使用,在JavaScript类中是不支持的。

报错.png

public

public的公共属性,就是不管在的内部还是外部,都可以访问该属性方法。默认定义的属性方法都是public

class Person {name = "前端娱乐圈";public age = 18;
}
const res = new Person();
console.log(res.name, res.age) // 前端娱乐圈 18

上面可以看到打印结果都能显示出来,name属性没有定义public公共属性,所以里面定义的属性方法默认都是public定义。

private

private的私有属性,只有在当前里面才能访问,当前就是{}里面区域内。在{}外面是不能访问private定义的属性方法

class Person {private name = "前端娱乐圈";private age = 18;
}
const res = new Person();
console.log(res.name, res.age) // 这俩行会爆红,当前属性为私有属性,只能在类内部访问class Scholl extends Person {getData() {return this.username + "," + this.age}
}
const temp = new Scholl()
console.log(temp.getData()) // 爆红~,虽然继承了Person类,但是private定义是只能在当前类访问,子类也不能访问。

protected

protected的保护属性,只有在当前类子类可以访问。也就是说用protected属性定义的子类也可以访问。

class Person {protected username = "前端娱乐圈";protected age = 18;
}
const res = new Person();
console.log(res.name, res.age) // 这俩行会爆红,当前属性为私有属性,只能在类内部访问class Scholl extends Person {getData() {return this.username + "," + this.age}
}
const temp = new Scholl()
console.log(temp.getData()) // 前端娱乐圈,18。可以正常访问父类的属性

例子

例如我们写如下一个小Demo弹窗,可以单独写一个class类里面,这样写法是不是比我们ES5中的prototype写法看着舒服多了。当然我们日常开发中的业务,公共方法也可以写进一个里面

class Mask {isShow = false;elem = nullconstructor() {this.elem = this.init()}init() {const oDiv = document.createElement("div");document.body.appendChild(oDiv);return oDiv;}show() {this.elem.style.display = "block"this.isShow = true;}hide() {this.elem.style.display = "none"this.isShow = false;}
}

结语

ES6class类毕竟是一个“语法糖”,所以只要理解了JavaScript中对象的概念和面向对象的思想,class 就不难理解啦~,下篇准备更新TypeScript文章感兴趣的小伙伴可以点个关注+赞哦。

最近组建了一个江西人的前端交流群,如果你是江西人可以加我微信 ruochuan12 私信 江西 拉你进群。

推荐阅读

1个月,200+人,一起读了4周源码
我历时3年才写了10余篇源码文章,但收获了100w+阅读

老姚浅谈:怎么学JavaScript?

我在阿里招前端,该怎么帮你(可进面试群)

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》10余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助1000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

识别方二维码加我微信、拉你进源码共读

今日话题

略。欢迎分享、收藏、点赞、在看我的公众号文章~

听说你对 ES6 class 类还不是很了解相关推荐

  1. ES6入门——类的概念

    1.Class的基本用法 概述 JavaScript语言的传统方式是通过构造函数,定义并生成新对象.这种写法和传统的面向对象语言差异很大,下面是一个例子: function Point(x, y) { ...

  2. 【JS(ES6,ES5类的创建及继承)】

    目录 一.ES6的面向对象的语法(ES6创建类) 1.面向过程(了解) 2.面向对象 3.面向对象的特征 4.ECMAScript6(即ES6)的面向对象的语法 5.练习 二.ES6中类的继承 三.E ...

  3. React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三、四

    转载地址 React 16 Jest ES6 Class Mocks(使用ES6语法类的模拟) 实例三.四 项目初始化 git clone https://github.com/durban89/we ...

  4. ES5和ES6的类,静态方法,继承实现代码

    ES5 类和静态方法 function Person(info) {//构造函数里面的方法和属性this.name = 'fur'this.age = 1this.run = function() { ...

  5. es5和es6声明类的区别/es5和es6继承的区别

    // es5和es6声明类的区别,es5没有统一语法规范.es6有统一写法规范 start. // es5声明"类"的语法--伪类 // function Person(name, ...

  6. typescript学习之路(四) —— ts类的继承(包含es5以及es6的类继承)

    上一文已经写了es5,es6等类的定义,所以本章主要写es5和es6的继承,由于es6的继承和ts的继承如出一辙,只是加了类型定义而已,所以ts的继承稍微写下,不会太详细. 文章目录 es5继承 原型 ...

  7. 去师范类学校学计算机,我是女生,大三了,现在在一个师范学校读计算机专业,我现在想跨专业考研,想考数学师范类的,会很难吗?...

    我是女生,大三了,现在在一个师范学校读计算机专业,我现在想跨专业考研,想考数学师范类的,会很难吗?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让 ...

  8. YOLOv5初探(看来这个YOLO5做得还不是很完善,过段时间再试试??)

    文章目录 YOLOv5简介 官方github链接 如何安装以及训练自己的数据集 安装 训练 1.创建Dataset.yaml文件 2.创建存放图片和标注的目录 3.创建标注labels 4.选择预训练 ...

  9. 这些工具类用起来真的很”香“

    juejin.im/post/6883876475594866695 刚入行的java开发程序员可能很多情况下对于一些代码的实现都是自己手动去实现的,不是说这样不好,在一定的程度上这种做法其实是浪费时 ...

最新文章

  1. .NET Core微服务之路:不断更新中的目录 (v0.42)
  2. mondrain多维分析引擎+saiku web展现层的演示环境搭建
  3. 安装php时,configure: error: xml2-config not found. Please check your libxml2 installation
  4. 机器人焊枪动作与编程实验_机器人编程实验报告.pdf
  5. Python换行符问题:\r\n还是\n?
  6. Java IO Serialization
  7. angular js 默认选中_AngularJS Select(选择框)
  8. 三个线程打印ABC10次,ABCABCABC....
  9. DX学习笔记之Surfaces
  10. 【转】java中的Map集合
  11. CVPR2020-深度图超分辨率DSR新方法| Channel Attention based Iterative Residual Learning for Depth Map SR
  12. python之论文降重工具
  13. List总结(LinkedList, ArrayList等使用场景和性能分析) [From skywang12345 ]
  14. linux vim编辑器命令,Linux之VIM编辑器命令
  15. 【华为机考刷题】2022_6_14
  16. Home Assistant 接入 Lifesmart(云起智能)家居的途径。
  17. 戴尔科技云平台:赋能“新基建”, 打造“云底座”
  18. MapReduce处理“大量”图片
  19. 使用宏批量修改word中图片大小
  20. 离线NTP服务器搭建(Linux)

热门文章

  1. 拉取ftp服务器上的文件_winscp和云服务器,2步实现winscp将文件上传到腾讯云Linux云服务器...
  2. 数据结构单向不循环链表实现多项式合并
  3. 笔记:Java虚拟机运行时数据区
  4. [Noi2014]随机数生成器
  5. android中xmlns:tools属性详解
  6. LightOj 1078 Basic Math
  7. PowerDesigner的文章
  8. 博弈论入门 HDU 1850
  9. HOJ 1015 Nearly prime numbers
  10. linux 如何在命令行下改系统时间