2013-10-24 4 views
3

Я вижу странное поведение в 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

+1

OT: С 'createVehicle' всегда принимает тип, чтобы создать то, что это' vehicleClass' недвижимость для? Когда «createVehicle» изменяет состояние фабрики, отключается. –

+0

@ T.J.Crowder - это хороший момент. Я бы согласился, что это, вероятно, плохой дизайн. – wootscootinboogie

ответ

4

Это простой вопрос о приоритете оператора. Попробуйте вместо

console.log('movingTruck is instance of Truck: ' + (movingTruck instanceof Truck)); 
+1

Это будет сделано. Я бы не подумал об этом какое-то время, если вообще когда-либо. – wootscootinboogie

+0

Простейшие проблемы всегда сложнее всего выяснить :) – hazerd

+0

@wootscootinboogie: Да, вы закончили делать, если строка была 'instanceof Truck', что, конечно же, не было. :-) –