2013-10-24 57 views
0

我已经得到了我与工作正常,扮演的是一个工厂模式例子,给了我一种方式来创建一个通用接口的相关对象:避免在JavaScript中继承使用新

$(document).ready(function() { 
      function Car(options) { 
       this.color = options.color || 'unknown', 
       this.name = options.carName || 'unknown', 
       this.doors = options.doors || 4; 
      } 
      function Truck(options) { 
       this.color = options.color || 'unknown', 
       this.name = options.name || 'unknow', 
       this.doors = options.doors || 2; 
      } 
      function VehicleFactory() { }; 
      VehicleFactory.prototype.createVehicle = function (options) { 
       if (options.vehicleType === 'car') { 
        return new Car(options); 
       } 
       else { 
        return new Truck(options); 
       } 
      } 
      var factory = new VehicleFactory(); 
      var car = factory.createVehicle({ 
       vehicleType: 'car', 
       name: 'bill', 
       doors: 2 
      }); 
      console.log(car instanceof Car);//true 
      var truck = factory.createVehicle({ 
       vehicleType: 'truck', 
       doors: 3 

      }); 
      //checks to make sure that objects are of the right type 
      console.log('truck is an instance of Car: ' + (truck instanceof Car)); //false 
      console.log('truck is an instace of Truck: ' + (truck instanceof Truck)); //true 
      console.log(truck); 
     }); 

即将从C#开始,这看起来很熟悉,我很容易理解。不过,我也倾向于站在巨人的肩膀上,道格·克罗克福德对新人说不。
我该如何重构此代码才能使用Object.create而不是新的。这对于普通人来说是否真的很重要,还是仅仅因为上层梯队说的那么重要?

+1

也许链接到克罗克福德的评论将帮助我们在上下文中解释它们。 –

+0

@MikeSamuel这是一个由三部分组成的系列,每部视频都有一个小时左右的时间,我会试着去看看我能否找到更加审慎的资源。 – wootscootinboogie

+1

这不是完全避免使用新关键字。 'Object.create'允许在JS(ECMA 5)中继承。使用new创建一个父对象只允许在该类内引用该对象,它不会从它继承。 –

回答

2

我该如何重构此代码以使用Object.create而不是new

return new Car(options); 

相当于(对于非宿主构造,和模非对象返回)到

var newCar = Object.create(Car.prototype); 
return Car.call(newCar, options) || newCar; 

它创建的对象,然后调用Car进行初始化。

你可以进一步重构Car采取一个未完成的车来初始化,而不是修改this

function initializeCar(car, options) { 
    car.color = options.color || "red"; 
    ... 
    return car; 
} 

,然后你的对象创建和初始化代码将

return initializeCar(Object.create(protoCar), options); 

但我不知道这是否解决了克罗克福德的主要问题。


最后把createVehicleVehicleFactory.prototype似乎并没有让你任何东西。为什么

VehicleFactory.prototype.createVehicle = ... 

+0

并允许汽车继承原始类的原型和命名空间......很好的答案。 –

+0

@Mike你能告诉我为什么我重构我的'返回新汽车(选项)'到你的'return.Car.call ...'那行'console.log('Car是汽车的实例:' +(car instanceof Car)); //旧的方式被解雇了,不是虚假的 '现在是假的? – wootscootinboogie

+0

小提琴http://jsfiddle.net/4ZDB3/检查行为 – wootscootinboogie