我有一个类构造函数,其主要工作是实例化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我移动
有一件事,我不喜欢这里。为了阻止所有车辆,我需要使用某些车辆的方法。但我想不出更好的方法。
答案 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,因此总有一种车辆可以调用该方法。