目录
一、class(类)的语法
二、代码
三、效果
一、class(类)的语法
ES6 提供了更接近传统语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class
关键字,可以定义类。
基本上,ES6 的class
可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class
写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
类的所有方法都定义在类的prototype
属性上面。因此,在类的实例上面调用方法,其实就是调用原型上的方法。由于类的方法都定义在prototype
对象上面,所以类的新方法可以添加在prototype
对象上面。
constructor()
方法是类的默认方法,通过new
命令生成对象实例时,自动调用该方法。一个类必须有constructor()
方法,如果没有显式定义,一个空的constructor()
方法会被默认添加。constructor()
方法默认返回实例对象(即this
)。
类必须使用new
调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new
也可以执行。
类的属性和方法,除非显式定义在其本身(即定义在this
对象上),否则都是定义在原型上(即定义在class
上)。类的所有实例共享一个原型对象。
ES2022 为类的实例属性,又规定了一种新写法。实例属性现在除了可以定义在constructor()
方法里面的this
上面,也可以定义在类内部的最顶层。
注意,新写法定义的属性是实例对象自身的属性,而不是定义在实例对象的原型上面。
这种新写法的好处是,所有实例对象自身的属性都定义在类的头部,看上去比较整齐,一眼就能看出这个类有哪些实例属性。
类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static
关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。
注意,如果静态方法包含this
关键字,这个this
指的是类,而不是实例。父类的静态方法,可以被子类继承。但不能被自己的实例继承。实例对象中的this指是该实例。
私有方法和私有属性,是只能在类的内部访问的方法和属性,外部不能访问
ES2022正式为class
添加了私有属性,方法是在属性名之前使用#
表示。
二、代码
在项目中新建src/class&module文件夹 ,在该文件夹下分别新建CreatBox/index.js文件、CreatImgBox/index.js文件和index.js文件。如下图:
- CreatBox/index.js为父类代码
- CreatImgBox/index.js为子类代码
- index.js为入口文件
- index.html
ES6 规定,子类必须在
constructor()
方法中调用super()
,否则就会报错。这是因为子类自己的this
对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,添加子类自己的实例属性和方法。如果不调用super()
方法,子类就得不到自己的this
对象。
index.js为入口文件
import {CreatBox} from './CreatBox'
let data1 = {
title: "父类创建",
list: ["父类创建-1", "父类创建-2", "父类创建-3",]
}
new CreatBox(".box1", data1)
import CreatImgBoxTest from "./CreatImgBox"
let data2 = {
title: "子类继承父类创建",
url: "./vite.svg",
list: ["子类继承父类创建-1", "子类继承父类创建-2", "子类继承父类创建-3",]
}
new CreatImgBoxTest(".box2", data2)
CreatBox/index.js为父类代码
class CreatBox {
constructor(select, data) {
this.ele = document.querySelector(select)
this.title = data.title
this.list = data.list
this.render()
}
render() {
let ohl = this.ele.querySelector(".ch2")
let oul = this.ele.querySelector("ul")
ohl.innerHTML = this.title
oul.innerHTML = this.list.map(item => `<li>${item}</li>`).join("")
console.log("123456");
}
}
export {
CreatBox
}
CreatImgBox/index.js为子类代码
import {CreatBox} from '../CreatBox'
class CreatImgBox extends CreatBox {
constructor(select, data) {
super(select, data)
this.imgurl = data.url
this.render()
}
render() {
super.render()
let oimg = this.ele.querySelector("img")
oimg.src = this.imgurl
oimg.style.width = "100px"
}
}
export default CreatImgBox
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>测试</h1>
<br/>
<div class="box1">
<h2 class="ch2"></h2>
<ul></ul>
</div>
<div class="box2">
<h2 class="ch2"></h2>
<img src="" alt="">
<ul></ul>
</div>
</body>
</html>
三、效果
源码地址:https://github.com/1t1824d/es6_module_class_promise_await_demo/tree/master