0

我有一个类构造函数,其主要工作是实例化对象。它需要 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 和两个方法运行 - 使车辆移动和 stopAll,停止所有车辆。

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 我在移动

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

4

1 回答 1

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

于 2013-09-14T19:15:00.223 回答