我有一个小工厂模式示例我正在玩的工作正常,并为我提供了一种通过通用接口创建相关对象的方法:
$(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
而不是新代码。这对普通人来说真的很重要吗,还是因为上层梯队说它确实很重要?
答案 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 = ...