白骑士的JavaScript教学高级篇之面向对象编程 4.2.3 类的静态属性与方法

        在JavaScript中,类不仅可以包含实例属性和方法,还可以定义静态属性和方法。静态属性和方法属于类本身,而不是类的实例。理解静态属性与方法的使用场景和它们与实例成员的区别,是深入掌握面向对象编程的重要步骤。

静态属性与方法的定义

        静态属性和方法使用‘static‘关键字定义。它们与普通的实例属性和方法不同,因为它们不是通过类的实例来访问的,而是直接通过类本身来访问。

定义静态属性

        在JavaScript中,静态属性可以通过在类定义外直接赋值的方式来声明。虽然ES6引入了类的语法,但并没有提供原生的方式来在类内部直接定义静态属性。通常,我们使用以下方式定义静态属性:

class Car {
    static wheels = 4; // 静态属性

    constructor(brand, model) {
        this.brand = brand;
        this.model = model;
    }

    drive() {
        console.log(‘${this.brand} ${this.model} is driving.‘);
    }
}


console.log(Car.wheels); // 输出:4

        在这个例子中,‘wheels‘是‘Car‘类的静态属性,表示所有汽车的轮子数量。它直接通过类名‘Car‘来访问,而不是通过类的实例。

定义静态方法

        静态方法类似于静态属性,使用‘static‘关键字在类内部定义。静态方法通常用于实现与实例无关的操作,例如工具类方法或工厂方法。

class MathUtil {
    static add(a, b) {
        return a + b;
    }

    static multiply(a, b) {
        return a * b;
    }
}


console.log(MathUtil.add(2, 3)); // 输出:5
console.log(MathUtil.multiply(4, 5)); // 输出:20

        在这个例子中,‘MathUtil‘类包含两个静态方法‘add‘和‘multiply‘,它们可以直接通过类名调用,而无需创建类的实例。

静态属性与方法的使用场景

        静态属性和方法通常在以下场景中使用:

工具类

        静态方法非常适合用于实现独立于实例的功能。例如,数学运算、日期处理、字符串操作等常见工具方法,都可以通过静态方法来实现。

class DateUtil {
    static getCurrentDate() {
        return new Date().toLocaleDateString();
    }
}


console.log(DateUtil.getCurrentDate()); // 输出当前日期

单例模式

        在实现单例模式时,静态方法通常用于创建和访问单例实例。单例模式确保一个类只有一个实例,并提供全局访问点。

class Singleton {
    static instance;

    constructor(name) {
        if (Singleton.instance) {
            return Singleton.instance;
        }

        this.name = name;
        Singleton.instance = this;
    }

    getName() {
        return this.name;
    }
}


const singleton1 = new Singleton('First Instance');
const singleton2 = new Singleton('Second Instance');

console.log(singleton1.getName()); // 输出:First Instance
console.log(singleton2.getName()); // 输出:First Instance
console.log(singleton1 === singleton2); // 输出:true

        在这个例子中,‘Singleton‘类确保了无论创建多少次,返回的始终是同一个实例。

配置与常量

        静态属性常用于定义类级别的配置或常量。这些值通常是全局的或与实例无关的。

class AppConfig {
    static appName = 'My Application';
    static version = '1.0.0';
}


console.log(AppConfig.appName); // 输出:My Application
console.log(AppConfig.version); // 输出:1.0.0

        在这个例子中,‘AppConfig‘类包含应用程序名称和版本号的静态属性,表示它们在整个应用程序中是全局唯一的。

静态属性与方法的继承

        静态属性和方法可以被子类继承,但它们并不参与实例化对象的继承链。在继承静态属性和方法时,子类可以直接访问或重写父类的静态成员。

继承静态方法

        子类可以继承并调用父类的静态方法,也可以选择重写这些方法。

class Parent {
    static sayHello() {
        console.log('Hello from Parent');
    }
}


class Child extends Parent {
    static sayHello() {
        console.log('Hello from Child');
    }
}


Parent.sayHello(); // 输出:Hello from Parent
Child.sayHello();  // 输出:Hello from Child

        在这个例子中,‘Child‘类继承了‘Parent‘类的静态方法‘sayHello‘,并进行了重写。

继承静态属性

        静态属性也可以被子类继承和修改。与实例属性不同,静态属性是在类级别继承的。

class Vehicle {
    static numberOfWheels = 4;
}


class Bike extends Vehicle {
    static numberOfWheels = 2;
}


console.log(Vehicle.numberOfWheels); // 输出:4
console.log(Bike.numberOfWheels);    // 输出:2

        在这个例子中,‘Bike‘类继承了‘Vehicle‘类的静态属性‘numberOfWheels‘,并将其重写为2。

总结

        静态属性与方法在JavaScript的面向对象编程中扮演着重要角色。它们提供了一种在类级别定义数据和行为的方式,而无需依赖于实例。这对于实现工具类、单例模式、全局配置等场景尤为有用。通过掌握静态属性与方法的概念及其应用,你将能够更加灵活地设计和组织你的代码,创建更具结构性和可维护性的JavaScript应用程序。

猜你喜欢

转载自blog.csdn.net/JeremyTC/article/details/143302511