Javascript 将变量作为构造函数返回
我是JavaScript新手,有人建议我读这本书。我在阅读工厂设计模式时遇到了以下困难,请看下面的脚本:Javascript 将变量作为构造函数返回,javascript,Javascript,我是JavaScript新手,有人建议我读这本书。我在阅读工厂设计模式时遇到了以下困难,请看下面的脚本: // Types.js - Constructors used behind the scenes // A constructor for defining new cars function Car( options ) { // some defaults this.doors = options.doors || 4; this.state = options.sta
// Types.js - Constructors used behind the scenes
// A constructor for defining new cars
function Car( options ) {
// some defaults
this.doors = options.doors || 4;
this.state = options.state || "brand new";
this.color = options.color || "silver";
}
// A constructor for defining new trucks
function Truck( options){
this.state = options.state || "used";
this.wheelSize = options.wheelSize || "large";
this.color = options.color || "blue";
}
// FactoryExample.js
// Define a skeleton vehicle factory
function VehicleFactory() {}
// Define the prototypes and utilities for this factory
// Our default vehicleClass is Car
VehicleFactory.prototype.vehicleClass = Car;
// Our Factory method for creating new Vehicle instances
VehicleFactory.prototype.createVehicle = function ( options ) {
switch(options.vehicleType){
case "car":
this.vehicleClass = Car;
break;
case "truck":
this.vehicleClass = Truck;
break;
//defaults to VehicleFactory.prototype.vehicleClass (Car)
}
return new this.vehicleClass( options );
};
// Create an instance of our factory that makes cars
var carFactory = new VehicleFactory();
var car = carFactory.createVehicle( {
vehicleType: "car",
color: "yellow",
doors: 6 });
// Test to confirm our car was created using the vehicleClass/prototype Car
// Outputs: true
console.log( car instanceof Car );
// Outputs: Car object of color "yellow", doors: 6 in a "brand new" state
console.log( car );
这是我为factory设计模式找到的示例,现在我的问题是理解下面的行。考虑到车辆类别定义为一个变量:
VehicleFactory.prototype.vehicleClass = Car;
我不理解它作为构造函数返回:
return new this.vehicleClass( options );
这是我唯一的困难,一遍又一遍地运行代码,对我来说仍然没有意义。您分配给
VehicleFactory.prototype.vehicleClass
的不是实际的类,而是对构造函数的引用
要在JavaScript中创建对象,新操作符后面必须跟一个构造函数。由于VehicleFactory.prototype.vehicleClass
或更高版本的代码this.vehicleClass
中包含对构造函数的引用,因此可以使用new this.vehicleClass(选项)
创建新的车辆对象
JavaScript的一大优势是能够将函数作为参数传递,而无需委托
我希望这能让事情变得更清楚一点
您好您分配给VehicleFactory.prototype.vehicleClass
的不是实际的类
,而是对构造函数的引用
要在JavaScript中创建对象,新操作符后面必须跟一个构造函数。由于VehicleFactory.prototype.vehicleClass
或更高版本的代码this.vehicleClass
中包含对构造函数的引用,因此可以使用new this.vehicleClass(选项)
创建新的车辆对象
JavaScript的一大优势是能够将函数作为参数传递,而无需委托
我希望这能让事情变得更清楚一点
问候语此处返回的内容不是函数(您是对的,它没有意义)。返回的是一个新对象(请参阅new
关键字)
当您想要返回类型为Truck
的新对象时,您将使用以下代码:
return new Truck( options )
但是,在这种特定情况下,所需的车辆类型由用户定义。因此此.vehicleClass
指的是在返回上方的开关中定义的值。换句话说,如果用户选择了汽车
(resp.卡车
),则车辆类
将被汽车
(resp.卡车
)取代
因此,将调用的构造函数将是在代码的第一行中定义的Car
或Truck
构造函数
我希望现在更清楚了。这里返回的不是函数(你是对的,它没有意义)。返回的是一个新对象(请参阅new
关键字)
当您想要返回类型为Truck
的新对象时,您将使用以下代码:
return new Truck( options )
但是,在这种特定情况下,所需的车辆类型由用户定义。因此此.vehicleClass
指的是在返回上方的开关中定义的值。换句话说,如果用户选择了汽车
(resp.卡车
),则车辆类
将被汽车
(resp.卡车
)取代
因此,将调用的构造函数将是在代码的第一行中定义的Car
或Truck
构造函数
我希望现在更清楚。在Javascript中,函数是对象,因此它们可以用作返回值。这意味着函数执行时不需要返回某种数据值或数据数组
一个函数可以返回另一个更专门的函数,也可以根据某些输入按需创建另一个函数。
这里有一个简单的例子:函数做一些工作,可能是一次性初始化,然后处理其返回值。返回值恰好是另一个函数,也可以执行该函数:
var setup = function () {
alert(1);
return function () {
alert(2);
};
};
// using the setup function
var my = setup(); // alerts 1
my(); // alerts 2
因为setup()包装了返回的函数,所以它创建了一个闭包,您可以使用此闭包存储一些私有数据,这些数据可由返回的函数访问,但外部代码无法访问。例如,计数器每次调用时都会给您一个递增的值:
var setup = function () {
var count = 0;
return function () {
return (count += 1);
};
};
// usage
var next = setup();
next(); // returns 1
资料来源:按
在您的情况下返回新的this.vehicleClass(选项)
返回一个新对象,调用构造函数vehicleClass
,在Javascript中函数是对象,因此它们可以用作返回值。这意味着函数执行时不需要返回某种数据值或数据数组
new <expression>(<arguments>)
一个函数可以返回另一个更专门的函数,也可以根据某些输入按需创建另一个函数。
这里有一个简单的例子:函数做一些工作,可能是一次性初始化,然后处理其返回值。返回值恰好是另一个函数,也可以执行该函数:
var setup = function () {
alert(1);
return function () {
alert(2);
};
};
// using the setup function
var my = setup(); // alerts 1
my(); // alerts 2
因为setup()包装了返回的函数,所以它创建了一个闭包,您可以使用此闭包存储一些私有数据,这些数据可由返回的函数访问,但外部代码无法访问。例如,计数器每次调用时都会给您一个递增的值:
var setup = function () {
var count = 0;
return function () {
return (count += 1);
};
};
// usage
var next = setup();
next(); // returns 1
资料来源:按
在您的情况下返回新的this.vehicleClass(选项)代码>,正在返回一个调用构造函数的新对象vehicleClass
new <expression>(<arguments>)
然后,在createVehicle
中,添加一个同名的本地属性:
this.vehicleClass = Car;
在后续查找中有效覆盖了原型
的车辆类别
:
a = createVehicle(); // no `vehicleType` here, returns `Car`
b = createVehicle({vehicleType: 'truck'}); // returns `Truck`
c = createVehicle(); // no `vehicleType` here, but this time it returns `Truck`???
一种更好的设计方法