我将详细讲解“JavaScript ES6中CLASS的使用详解”的完整攻略,内容包括:什么是类,类的定义及语法,类的继承,实例化对象,类的静态方法和属性。
一、什么是类
类(class)是一种面向对象编程(OOP)的概念,它是一种用来描述对象特征的用户自定义类型。JavaScript一直以来都是支持面向对象编程的,但是在ES6之前,它的实现方式都是基于构造函数和原型的。而ES6引入了class关键字,使得定义和使用类更加明确和直观。
二、类的定义及语法
1. 类的定义
在ES6中,我们使用class关键字来定义一个类。语法如下:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
2. 类的构造函数
上面的代码中,我们定义了一个名为Rectangle的类,它有一个构造函数constructor,构造函数用于初始化对象的属性。在构造函数中,我们通过this关键字来引用当前对象,然后给它的属性height和width赋值。如果我们要创建一个新的Rectangle对象,可以这样做:
let rect = new Rectangle(10, 20);
console.log(rect.height); // 输出10
console.log(rect.width); // 输出20
3. 类的方法
在类中,我们还可以定义一些方法,用于操作对象的属性或进行一些逻辑处理。方法和普通函数的定义方式基本一致,只不过它们必须定义在类的内部。例如:
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
calcArea() {
return this.height * this.width;
}
}
上面的代码中,我们定义了一个名为calcArea的方法,用于计算矩形的面积。使用方法也很简单:
let rect = new Rectangle(10, 20);
console.log(rect.calcArea()); // 输出200
4. 类的访问器属性
类中也支持定义访问器属性,访问器属性通常用于操作对象的属性值,例如自定义setter和getter方法。语法如下:
class Rectangle {
constructor(height, width) {
this._height = height;
this._width = width;
}
get height() {
return this._height;
}
set height(value) {
this._height = value;
}
calcArea() {
return this._height * this._width;
}
}
上面的代码中,我们定义了两个访问器属性height和width,它们分别用于获取和设置矩形的高度和宽度。使用方法也很简单:
let rect = new Rectangle(10, 20);
console.log(rect.calcArea()); // 输出200
rect.height = 5;
console.log(rect.calcArea()); // 输出100
5. 类的静态方法和属性
在类中,还可以定义静态方法和属性。静态方法和属性是属于类本身的,而不是属于类的实例的。我们可以通过类名来调用静态方法和属性。例如:
class Circle {
static PI = 3.14;
static calcArea(radius) {
return Circle.PI * radius * radius;
}
}
console.log(Circle.PI); // 输出3.14
console.log(Circle.calcArea(5)); // 输出78.5
上面的代码中,我们定义了一个名为Circle的类,其中包含一个静态属性PI和一个静态方法calcArea。我们可以通过类名Circle来访问这些静态成员。
三、类的继承
类与类之间也可以进行继承,使子类可以继承父类的属性和方法。语法如下:
class Square extends Rectangle {
constructor(side) {
super(side, side);
}
}
上面的代码中,我们定义了一个名为Square的子类,它继承自Rectangle父类。我们在Square的构造函数中使用super关键字来调用父类的构造函数,从而初始化子类的属性。Square继承了Rectangle的所有属性和方法,包括calcArea方法。
使用方法也很简单:
let square = new Square(5);
console.log(square.calcArea()); // 输出25
四、类的实例化对象
当我们定义一个类时,它只是一个模板,不会占用任何内存空间。要创建一个实际的对象,需要实例化这个类。语法如下:
let rect = new Rectangle(10, 20);
上面的代码中,我们使用new关键字来创建Rectangle类的一个实例rect。要注意的是,类名后面必须跟圆括号,这是因为类的构造函数也必须使用new关键字来创建对象。
五、示例说明
下面是两个示例说明,用于演示类的使用:
示例一:汽车销售店
class Car {
constructor(brand, model, price) {
this.brand = brand;
this.model = model;
this.price = price;
}
getBrand() {
return this.brand;
}
getModel() {
return this.model;
}
getPrice() {
return this.price;
}
}
class CarStore {
constructor(name) {
this.name = name;
this.cars = [];
}
addCar(car) {
this.cars.push(car);
}
getAllCars() {
return this.cars;
}
getCheapestCar() {
return this.cars.sort((a, b) => a.getPrice() - b.getPrice())[0];
}
}
let bmw = new Car('BMW', 'X7', 1200000);
let benz = new Car('Benz', 'S600', 1800000);
let store = new CarStore('Best Cars');
store.addCar(bmw);
store.addCar(benz);
console.log(store.getCheapestCar().getModel()); // 输出'X7'
上面的代码中,我们定义了两个类,Car和CarStore。Car表示汽车,CarStore表示汽车销售店。我们在Car类中定义了一些属性和方法,用于表示汽车的品牌、型号和价格等信息。在CarStore类中,我们定义了一些方法,用于向销售店添加汽车,获取销售店所有的汽车,并且获取销售店的最便宜的汽车。我们创建了两个Car对象,分别代表一辆BMW汽车和一辆Benz汽车,然后将它们添加到了CarStore中。最后,我们通过调用getCheapestCar()方法获得了CarStore中最便宜的汽车,然后输出了它的型号。
示例二:图形面积计算器
class Shape {
constructor() {
if (new.target === Shape) {
throw new TypeError('Shape cannot be instantiated directly.');
}
}
calcArea() {
throw new Error('calcArea() method must be implemented.');
}
toString() {
return Object.getPrototypeOf(this).constructor.name;
}
}
class Circle extends Shape {
constructor(radius) {
super();
this.radius = radius;
}
calcArea() {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle extends Shape {
constructor(height, width) {
super();
this.height = height;
this.width = width;
}
calcArea() {
return this.height * this.width;
}
}
let circle = new Circle(5);
let rect = new Rectangle(10, 20);
let shapes = [circle, rect];
shapes.forEach(shape => console.log(`${shape.toString()} area: ${shape.calcArea()}`));
上面的代码中,我们定义了一个Shape类,它是一个抽象类,不能直接实例化。我们在Shape中定义了一些方法,用于继承到子类中,这些方法包括惯例的toString()方法和抽象的calcArea()方法。我们还使用了ES6引入的new.target语法来检测Shape是否被直接实例化,如果是,就抛出一个错误。我们在Circle和Rectangle子类中继承了Shape,并分别实现了calcArea()方法,用于计算圆和矩形的面积。最后,我们创建了一个数组shapes,其中包含了一个Circle和一个Rectangle对象。然后遍历shapes数组,对每个对象调用toString()和calcArea()方法,并输出它们的字符串形式和面积。
六、总结
上面我们详细讲解了JavaScript ES6中CLASS的使用。类是一种用来描述对象特征的用户自定义类型,在ES6中通过class关键字进行定义。我们通过示例演示了类如何使用,包括类的定义及语法、类的方法和访问器属性、类的静态方法和属性、类的继承、类的实例化对象等内容。掌握了这些内容,你就可以使用类来更加方便地实现面向对象编程了。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript ES6中CLASS的使用详解 - Python技术站