1)概述
-
在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。
-
class 的本质是 function。
-
它可以看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
-
类不可重复声明
-
类定义不会被提升,这意味着必须在访问前对类进行定义,否则就会报错
2)类定义
(1)声明类
//类名要大写
class Person {
constructor(a) {
this.x = a
}
}
var p1 = new Person(2)
console.log(p1);
(2) 匿名类
var fn = class {
constructor(a) {
this.x = a
}
}
var f1 = new fn(2)
console.log(f1);
3)类的主体
(1)属性:ES6的类中不能直接定义变量,变量被定义在constructor中。
class Person {
// Person类的内部可以写一个constructor方法,用这个类创建对象时,就会运行构造函数
// 不写构造函数,系统会默认有一个空的构造函数运行
constructor() {
this.a = 886
}
}
var p1 = new Person()
console.log(p1.a);
(2)方法
constructor 方法是类的默认方法,创建类的对象时被调用。也被称为类的构造方法(构造函数、构造器)。一个类中有且仅有一个构造方法。
class Person {
constructor() {
console.log("hello");
}
}
new Person()
原型方法:不需要使用function关键字,通过“对象.原型方法”调用。
class Person {
say(a,b) {
console.log(a*b);
}
}
var p1 = new Person()
p1.say(2,3)
静态方法:使用static修饰,调用时不需要创建对象,直接通过“类名.静态方法”调用。
class Person {
static name = "xiaozhang"
}
var p1 = new Person()
console.log(Person.name);
4)类的继承
-
解决代码的复用
-
使用extends关键字实现继承
-
子类可以继承父类中所有的方法和属性
-
子类只能继承一个父类(单继承),一个父类可以有多个子类
-
子类的构造方法中必须有super()来指定调用父类的构造方法,并且位于子类构造方法中的第一行
-
子类中如果有与父类相同的方法和属性,将会优先使用子类的(覆盖)
class Person {
life = 1
constructor(name) {
this.name = name
this.say = function () {
console.log(this.name + ",你好");
}
}
zz() {
console.log(this.name + ",你真帅");
}
static str = "abc"
}
class Student extends Person {
constructor(name) {
super(name)
this.age = 21
this.height = 175
}
}
var s1 = new Student("xiaozhang")
console.log(s1);
s1.say()
s1.zz()
console.log(Student.str);
内部类:属于外部类的成员,必须通过“外部类.内部类”访问.
// 外部类
class Person {
constructor() {
console.log("abc");
}
}
// 内部类
Person.Children = class {
constructor() {
console.log(123);
}
}
new Person.Children()