0

私が遊んでいる小さなファクトリ パターンの例があります。これは正常に動作し、一般的なインターフェイスを使用して関連オブジェクトを作成する方法を提供します。

 $(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それは平均的な人にとって本当に重要なのか、それとも上層部がそう言うから重要なのか?

4

1 に答える 1

2

の代わりに Object.create を使用するようにこのコードをリファクタリングするにはどうすればよいnewですか?

return new Car(options);

(非ホスト コンストラクター、および modulo 非オブジェクト戻り値の場合) と同等です。

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 = ...

?

于 2013-10-24T18:50:03.360 に答える