Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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,我是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

我是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.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`???
一种更好的设计方法