避免在JavaScript继承中使用新的
我正在玩一个工厂模式的小例子,它工作得很好,给了我一种使用通用接口创建相关对象的方法:避免在JavaScript继承中使用新的,javascript,Javascript,我正在玩一个工厂模式的小例子,它工作得很好,给了我一种使用通用接口创建相关对象的方法: $(document).ready(function () { function Car(options) { this.color = options.color || 'unknown', this.name = options.carName || 'unknown', this.d
$(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而不是new
等价于(对于非宿主构造函数,并对非对象返回进行模化)
它创建一个对象,然后调用Car
对其进行初始化
您可以进一步重构汽车
,将未完成的汽车初始化,而不是修改此
:
function initializeCar(car, options) {
car.color = options.color || "red";
...
return car;
}
然后您的对象创建和初始化代码将
return initializeCar(Object.create(protoCar), options);
但我不知道这些是否解决了Crockford的主要担忧
最后,将createVehicle
放在VehicleFactory.prototype
上似乎并没有什么效果。为什么
VehicleFactory.prototype.createVehicle = ...
?也许Crockford评论的链接可以帮助我们在上下文中解释它们。@MikeSamuel这是他制作的一个三部分系列,每个视频大约有一个小时长,我将尝试寻找一个更谨慎的资源。这并不是完全回避新的关键字<代码>对象。创建允许在JS(ECMA 5)中继承。使用new创建父对象只允许在类中引用该对象,而不是从其本身继承。相关问题:并允许Car继承原始类的原型和命名空间。。。回答得好。@Mike,你能告诉我为什么我要将我的归还新车(选项)
重构为你的归还.Car.call…
行`console.log('Car is instance of Car:'+(Car instanceof Car))//旧方法激发true,而不是it's false`is now false?除非您使用的是对象的实现。创建非标准的,它应该与实例的w.r.t工作相同?这似乎是一些我需要知道的行话:)@MikeSamuel我忘了你可以把参数传递给Object.create,回答得好。
return initializeCar(Object.create(protoCar), options);
VehicleFactory.prototype.createVehicle = ...