代码重构.对类的所有实例进行操作的方法

code refactoring. Method that operates on all instances of the class

本文关键字:操作 方法 实例 重构 代码      更新时间:2023-09-26

我有一个类构造函数,其主要工作是实例化对象。它获取 ID,检查之前未创建具有此类 ID 的对象并创建它。

function Vehicle(ID){
    if (this.listOfVehicles.indexOf(ID) !== -1) throw new Error('Vehicle with such ID already exists');
    this.ID = ID;
    this.listOfVehicles.push(ID);
    this.isMoving = true;
}

对象的原型存储了所有对象 ID 和运行两种方法 - 这使得车辆移动和停止所有,从而停止所有车辆。

Vehicle.prototype = {
    'listOfVehicles' : [],
    'run'            : function(){
        this.isMoving = true;
    },
    'stopAll'           : function(){
        var vehicleID, i, listOfVehicles = Vehicle.prototype.listOfVehicles;
        for(i = 0; i < listOfVehicles.length; i++){
            vehicleID = listOfVehicles[i];
            vehicles[vehicleID].isMoving = false;
        }
    }
};

基本上一切都运行良好:

var vehicles = {};
vehicles[3] = new Vehicle(3);
vehicles[6] = new Vehicle(6);
vehicles[12] = new Vehicle(12);

所有车辆都实例化并移动

vehicles[3].stopAll();

所有车辆均未移动

vehicles[3].run();

只有车辆 3 i 移动

有一件事,我不喜欢这里。为了停止所有车辆,我需要使用某些车辆的方法。但是我想不出更好的方法。

您可以定义:

Vehicle.stopAll = function () {
    var vehicleID, i, listOfVehicles = Vehicle.prototype.listOfVehicles;
    for(i = 0; i < listOfVehicles.length; i++){
        vehicleID = listOfVehicles[i];
        vehicles[vehicleID].isMoving = false;
    }
}

实际上没有什么需要你把这个函数附加到类,你也可以把它定义为:

function stopAllVehicles () {
    var vehicleID, i, listOfVehicles = Vehicle.prototype.listOfVehicles;
    for(i = 0; i < listOfVehicles.length; i++){
        vehicleID = listOfVehicles[i];
        vehicles[vehicleID].isMoving = false;
    }
}

因为 Javascript 类没有实现信息隐藏(你可以通过将信息包含在函数的局部变量中来自己做到这一点)。

或者,您可以使用原始类定义,并使用Vehicle.prototype.stopAll() .由于 JS 使用基于原型的 OO,因此始终有一个工具可用于调用该方法。