JavaScript 类 (class)
在 JavaScript 中,class 是一种定义对象的模板,可以用来创建多个具有相同属性和方法的对象。class 是 ES6(ECMAScript 2015)引入的一个新特性,它提供了一种更加面向对象的编程方式,使用起来类似于其他面向对象编程语言(如 Java 或 C++)的类定义方式。
在 JavaScript 中,类是通过 class 关键字定义的,可以包含构造函数、方法以及静态方法。类的实例是通过 new 关键字来创建的。
1. 基本语法:
class ClassName {
constructor(parameters) {
// 构造函数
}
method1() {
// 普通方法
}
static staticMethod() {
// 静态方法
}
}
constructor:构造函数,用于初始化类的实例,类实例化时自动调用。method1:类的实例方法,所有实例对象都可以调用这些方法。staticMethod:类的静态方法,不能通过实例调用,只能通过类名调用。
2. 创建类与实例:
创建类后,可以使用 new 关键字来实例化类。
示例:
// 定义一个类
class Person {
constructor(name, age) {
this.name = name; // 实例属性
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
// 创建类的实例
const person1 = new Person("Alice", 30);
const person2 = new Person("Bob", 25);
// 调用实例方法
person1.greet(); // 输出: Hello, my name is Alice and I am 30 years old.
person2.greet(); // 输出: Hello, my name is Bob and I am 25 years old.
Person是一个类,constructor用于初始化对象,greet是一个实例方法。- 通过
new Person()创建了person1和person2两个实例对象。
3. 类的继承:
JavaScript 中的类支持继承,可以通过 extends 关键字继承父类的属性和方法。继承的类可以调用父类的方法,并可以覆盖(重写)父类的方法。
示例:
// 父类
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a sound.`);
}
}
// 子类继承父类
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类的构造函数
this.breed = breed;
}
speak() {
console.log(`${this.name} barks.`);
}
}
const dog = new Dog("Buddy", "Golden Retriever");
dog.speak(); // 输出: Buddy barks.
Dog类通过extends关键字继承了Animal类。- 使用
super()调用父类的构造函数,继承了name属性。 - 子类重写了父类的
speak()方法。
4. 静态方法:
静态方法是属于类本身而不是类的实例的方法。静态方法可以通过类名直接调用,而不能通过实例调用。
示例:
class MathUtility {
static add(a, b) {
return a + b;
}
static subtract(a, b) {
return a - b;
}
}
console.log(MathUtility.add(5, 3)); // 输出: 8
console.log(MathUtility.subtract(5, 3)); // 输出: 2
add和subtract是静态方法,通过MathUtility.add()直接调用。
5. 获取和设置器(getter & setter):
类可以使用 getter 和 setter 方法来控制对对象属性的访问。getter 用于获取属性值,setter 用于设置属性值。
示例:
class Person {
constructor(name) {
this._name = name; // 使用下划线命名属性表示私有变量
}
// Getter
get name() {
return this._name;
}
// Setter
set name(value) {
this._name = value;
}
}
const person = new Person("Alice");
console.log(person.name); // 输出: Alice
person.name = "Bob";
console.log(person.name); // 输出: Bob
name是一个 getter 和 setter,允许我们在访问或修改_name时进行自定义的处理。
6. 实例属性与静态属性:
实例属性是每个实例对象独有的属性,静态属性是类本身所具有的属性。
示例:
class Car {
constructor(make, model) {
this.make = make; // 实例属性
this.model = model;
}
static manufacturer = "Toyota"; // 静态属性
}
const car1 = new Car("Corolla", "2023");
console.log(car1.make); // 输出: Corolla
console.log(Car.manufacturer); // 输出: Toyota
make和model是实例属性,每个对象有自己的值。manufacturer是静态属性,类本身有一个共享的属性。
7. 类的方法与箭头函数:
类中的方法一般使用常规的函数定义,但可以使用箭头函数来定义类中的某些方法。箭头函数的 this 继承自外部作用域,而不是绑定到类的实例。
示例:
class Counter {
constructor() {
this.count = 0;
this.increment = () => {
this.count++;
console.log(this.count);
};
}
}
const counter = new Counter();
counter.increment(); // 输出: 1
counter.increment(); // 输出: 2
- 在这里,
increment是一个箭头函数,它的this始终指向Counter实例。
总结:
- 类的定义:使用
class关键字定义类,constructor用于构造函数,method用于实例方法。 - 类的实例化:通过
new关键字创建类的实例。 - 继承:使用
extends关键字继承父类,super()调用父类的构造函数。 - 静态方法:静态方法属于类本身,通过类名直接调用。
- getter & setter:通过 getter 和 setter 控制属性的访问和设置。
- 实例属性与静态属性:实例属性属于每个对象,静态属性属于类本身。
- 箭头函数:类的方法可以使用箭头函数,但要注意箭头函数的
this行为。
通过理解和使用 JavaScript 类,可以让你的代码更加结构化、易于维护,同时更好地模拟面向对象编程的思想。更多详细文章请关注其他相关文章。