避免在JavaScript继承中使用new

时间:2013-10-24 18:45:14

标签: 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 :(得分: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);

但我不知道这是否正在解决Crockford的主要问题。


最后将createVehicle放在VehicleFactory.prototype上似乎没有任何帮助。为什么

VehicleFactory.prototype.createVehicle = ...