Я вижу странное поведение в JavaScript, и я хотел бы знать, что его вызывает. У меня есть следующий код, который использует заводскую схему для создания двух типов автомобилей, автомобилей и грузовиков.instanceof check in JavaScript factory pattern
$(document).ready(function() {
//car constructor
function Car(options) {
//defaults
this.doors = options.doors || 4;
this.state = options.state || "brand new";
this.color = options.color || " silver";
};
//truck constructor
function Truck(options) {
this.state = options.state || "used";
this.wheelSize = options.wheelSize || "large";
this.color = options.color || "blue";
}
//define a skeleton vehicle factory
function VehicleFactory() { };
//default vehicleClarr is Car
VehicleFactory.prototype.vehicleClass = Car;
//our factory method for creating new Vehicle instances
VehicleFactory.prototype.createVehicle = function (options) {
if (options.vehicleType === 'car') {
this.vehicleClass = Car;
}
else {
this.vehicleClass = Truck;
}
return new this.vehicleClass(options);
}
//create an instance of our factory that makes cars
var carFactory = new VehicleFactory();
var car = carFactory.createVehicle({
vehicleType: 'car',
color: 'yellow',
doors: 6
});
//true
console.log(car instanceof Car);
console.log('car: ' + car instanceof Car);
var movingTruck = carFactory.createVehicle({
vehicleType: 'truck',
state: 'like new',
color: 'red',
wheelSize: 'regular'
});
//true
console.log(movingTruck instanceof Truck);
//false?
console.log('movingTruck is instance of Truck: ' + movingTruck instanceof Truck);
});
При записи на консоль, если я проверяю, если типы транспортных средств, я воплощенные были правильными типами я заметил, что console.log(movingTruck instanceof Truck)
было бы верно но console.log('movingTruck is instance of Truck: ' + movingTruck instanceof Truck)
бы неверно. Почему это? Fiddle
OT: С 'createVehicle' всегда принимает тип, чтобы создать то, что это' vehicleClass' недвижимость для? Когда «createVehicle» изменяет состояние фабрики, отключается. –
@ T.J.Crowder - это хороший момент. Я бы согласился, что это, вероятно, плохой дизайн. – wootscootinboogie