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

时间:2013-09-14 18:29:55

标签: javascript oop refactoring

我有一个类构造函数,其主要工作是实例化Objects。它需要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我移动

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

1 个答案:

答案 0 :(得分:0)

您可以定义:

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,因此总有一种车辆可以调用该方法。