一、类的概念
具有相似属性和行为的事物。比如: 人(女人、男人、小孩),动物(狗、猫,牛...)等等。
二、类的使用
1.语法
// 类名首字母一般大写
class 类名 {
• // 构造函数
constructor() {
• }
}
2.实例
注意: 在类中的 this 指向的是 实例 本身,而静态属性和方法,是属于类的,不是属于某个实例。
class Animal {
// 构造函数
constructor(name) {
this.name = name; // 实例属性
}
static age = 1; // 静态属性 只能通过类名进行引用
#color = '黄色'; // 私有属性
// 普通方法
call(value) {
console.log(`${this.name}动物在${value}叫,它是一只${this.#color}动物`);
}
// 静态方法 只能通过类名进行调用
static getAge() {
// 静态方法内部不能使用 this 来访问实例属性或实例方法。 因为静态方法没有和任何具体的实例绑定。
console.log('我是Animal类的静态方法,我的静态属性是',Animal.age);
}
// 私有方法
#motion() {
console.log(`${this.name}在运动`);
}
}
// 实例化
const dog = new Animal('可乐'); // 通过给构造函数传值,直接给dog实例属性 name 赋值为 ’可乐‘
// 访问普通方法
console.log(dog.call('汪汪汪'));
// 访问静态属性 和 静态方法
console.log(Animal.age, Animal.getAge());
三、类的属性
JavaScript中的类的属性有:实例属性、静态属性、私有属性
1.实例属性
定义在构造函数 constructor 的this上,通过【实例名.属性名】访问。
2.静态属性
使用 static 关键子进行定义,通过【类名.静态属性名】访问。
3.私有属性
通过 #属性名 进行定义,只能在类 内部访问,通过【this.#属性名】访问。
四、类的方法
JavaScript中的类的方法有:构造方法、普通方法、静态方法、私有方法。
1.构造方法
名为constructor()的方法;
用于初始化实例对象的属性;
使用 new 关键字实例化时,自动调用;
定义类时,若没有定义constructor 方法,JavaScript 会自动声明一个空的constructor方法;
2.普通方法
与实例对象关联,实例对象可直接调用;
可以访问实例属性和其他实例方法;
必须先创建实例,再进行调用;
普通方法实际上是定义在 类的 原型 上的方法,所有实例对象 共享 普通方法;
当有继承关系时,子类可重写普通方法;
3.静态方法
属于类而不是实例;
无法访问实例属性和实例方法;
可以访问静态属性和静态方法;
有继承关系时,可重写静态方法;
通常用于提供工具性和通用功能,如格式化工具;
4.私有方法
只能在类 内部进行调用;
五、继承
1.单继承
一个子类只能继承一个父类。这是 JavaScript 中类继承的常见形式。在这种继承方式下,子类会继承父类的属性和方法,并可以根据需要进行扩展或重写。例如:
class Animal {
constructor(name) {
this.name = name;
}
makeSound() {
console.log('Animal sound');
}
}
class Dog extends Animal {
constructor(name) {
super(name);
}
makeSound() {
console.log('Woof!');
}
}
let dog = new Dog('Buddy');
dog.makeSound(); // 输出 "Woof!",子类重写了父类的makeSound方法
2.组合继承
组合继承是指在一个类中包含其他类的实例,从而复用其他类的功能。例如:
class Flyable {
fly() {
console.log('Flying');
}
}
class Swimmable {
swim() {
console.log('Swimming');
}
}
class Duck {
constructor() {
// 创建其他类的实例 为当前类的属性
this.flyable = new Flyable();
this.swimmable = new Swimmable();
}
fly() {
// 在当前类的方法中,调用实例属性的方法
this.flyable.fly();
}
swim() {
// 在当前类的方法中,调用实例属性的方法
this.swimmable.swim();
}
}
let duck = new Duck();
duck.fly(); // 输出 "Flying"
duck.swim(); // 输出 "Swimming"
3.多级继承
多级继承是指一个类继承自另一个类,而这个父类又继承自其他类,形成一个继承链。例如:
class Organism {
constructor(living) {
this.living = living;
}
}
class Animal extends Organism {
constructor(living, name) {
super(living); // 调用父类的构造方法
this.name = name;
}
makeSound() {
console.log('Animal sound');
}
}
class Mammal extends Animal {
constructor(living, name, hasFur) {
super(living, name);
this.hasFur = hasFur;
}
}
let mammal = new Mammal(true, 'Lion', true);
console.log(mammal.name); // 输出 "Lion"
mammal.makeSound(); // 输出 "Animal sound"
六、super的使用
super关键字用于调用父类的属性和方法;
在调用时,需要指定调用的父类属性或父类方法;
super必须写在this.XXX之前;
// 调用父类的构造方法
super();
// 访问父类属性
super.属性;
// 调用父类方法
super.方法名();