Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
避免在JavaScript继承中使用新的_Javascript - Fatal编程技术网

避免在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 = ...