JS类的定义与面向对象
在JavaScript中,class关键字用于定义类,这是ES6(ECMAScript2015)引入的语法糖,使得定义类更加直观和简洁,类本质上还是基于原型的,但通过class关键字,代码更具可读性,更易于理解和维护。
认识class定义类
在ES6之前,JavaScript并没有直接的类(class)概念,而是通过构造函数和原型链来模拟类的行为,从ES6开始,可以使用class关键字来定义类,这使得代码更加清晰和简洁。

class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(Hello, my name is ${this.name});
}
}
类和构造函数的异同
类和构造函数有很多相似之处,类的构造函数是一种特殊的方法,用于初始化新创建的对象,每个类只能有一个构造函数,如果包含多个构造函数会抛出异常。
| 特性 | 类 | 构造函数 |
| 定义方式 | 使用class 关键字 |
使用function 关键字 |
| 实例化 | 使用new 关键字 |
使用new 关键字 |
| 继承 | 使用extends 关键字 |
使用原型链 |
| 访问器方法 | 支持getter 和setter |
不支持 |
| 静态方法 | 支持,使用static 关键字 |
不支持 |
类的构造函数
类的构造函数是一种特殊的方法,名称固定为constructor,用于初始化新创建的对象,当通过new 操作符创建一个类的实例时,会自动调用这个构造函数。
class Person {
constructor(name) {
this.name = name;
}
}
const person = new Person('John'); // John
类的实例方法
实例方法是定义在类中的普通方法,这些方法可以由类的实例调用。
class Person {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(Hello, my name is ${this.name});
}
}
const person = new Person('John');
person.sayHello(); // 输出: Hello, my name is John
类的访问器方法
类可以定义getter 和setter 方法,用来获取或设置对象的属性值。
class Person {
constructor(name) {
this._name = name;
}
get name() {
return this._name;
}
set name(newName) {
this._name = newName;
}
}
const person = new Person('John');
console.log(person.name); // 输出: John
person.name = 'Jane';
console.log(person.name); // 输出: Jane
类的静态方法
静态方法是定义在类上的方法,不需要实例化就可以调用,静态方法使用static 关键字定义。
class Person {
static sayStaticMessage() {
console.log('This is a static method');
}
}
Person.sayStaticMessage(); // 输出: This is a static method
ES6类的继承 extends
ES6 提供了extends 关键字来实现类的继承,使得代码更加简洁。
class Animal {
constructor(name) {
this.name = name;
}
makeSound() {
console.log(${this.name} makes a sound);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // 调用父类的构造函数
}
makeSound() {
console.log(${this.name} barks);
}
}
const dog = new Dog('Rex');
dog.makeSound(); // 输出: Rex barks
super关键字
super 关键字用于调用父类的构造函数和方法,可以在子类的构造函数、实例方法和静态方法中使用。
class Animal {
constructor(name) {
this.name = name;
}
makeSound() {
console.log(${this.name} makes a sound);
}
}
class Dog extends Animal {
constructor(name) {
super(name); // 调用父类的构造函数
}
makeSound() {
super.makeSound(); // 调用父类的方法
console.log(${this.name} barks);
}
}
继承内置类
JavaScript 允许自定义类继承内置类,例如Array。
class CustomArray extends Array {
customMethod() {
console.log('Custom method for CustomArray');
}
}
const arr = new CustomArray(1, 2, 3);
arr.customMethod(); // 输出: Custom method for CustomArray
类的混入mixin
由于JavaScript只支持单继承,可以通过混入(mixin)的方式在一个类中添加更多功能。
const FlyMixin = (Base) => class extends Base {
fly() {
console.log(${this.name} can fly);
}
};
class Bird {
constructor(name) {
this.name = name;
}
}
const FlyingBird = FlyMixin(Bird);
const bird = new FlyingBird('Eagle');
bird.fly(); // 输出: Eagle can fly
十一、JavaScript中的多态
多态是指同一个操作作用于不同的对象时表现出不同的行为,JavaScript是一种动态语言,天生支持多态。
class Animal {
makeSound() {
console.log('Some generic sound');
}
}
class Dog extends Animal {
makeSound() {
console.log('Bark');
}
}
class Cat extends Animal {
makeSound() {
console.log('Meow');
}
}
const animals = [new Dog(), new Cat()];
animals.forEach(animal => animal.makeSound()); // 输出: Bark, Meow
相关问题与解答栏目:提出两个与本文相关的问题,并做出解答。
问题1:在JavaScript中,类的构造函数和方法有什么区别?为什么构造函数的名称必须是constructor?
答案:在JavaScript中,构造函数是一种特殊的方法,用于初始化新创建的对象,每个类只能有一个构造函数,其名称必须是constructor,而类的方法则是定义在类中的普通方法,可以被类的实例调用,构造函数在创建对象时自动调用,而普通方法则需要显式调用,构造函数的名称固定为constructor 是为了规范和一致性。
问题2:如何在JavaScript中实现类的继承?为什么需要使用super 关键字?
答案:在JavaScript中,可以通过extends 关键字实现类的继承。class Dog extends Animal 表示Dog 类继承了Animal 类。super 关键字用于调用父类的构造函数和方法,确保子类能够正确继承和使用父类的功能,在子类的构造函数中,必须先调用super 方法才能使用this 或返回对象,以确保父类的构造函数被正确执行。
以上内容就是解答有关“关于js类的定义-js面向对象”的详细内容了,我相信这篇文章可以为您解决一些疑惑,有任何问题欢迎留言反馈,谢谢阅读。