gpt4 book ai didi

javascript - 避免在 JavaScript 继承中使用 new

转载 作者:行者123 更新时间:2023-12-02 18:12:49 26 4
gpt4 key购买 nike

我正在使用一个小工厂模式示例,它运行良好,并为我提供了一种使用通用接口(interface)创建相关对象的方法:

 $(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#,这看起来很熟悉,我很容易理解。然而,我也倾向于尝试站在巨人的肩膀上,而 Doug Crockford 对新事物说不。
我如何重构此代码以使用 Object.create 而不是 new。这对普通人来说真的很重要,还是只是因为高层这么说才重要?

最佳答案

How could I refactor this code to use Object.create instead of 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 = ...

关于javascript - 避免在 JavaScript 继承中使用 new,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19574064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com