2015-03-17 5 views
0

Эй, ребята, я новичок в яваскрипт и я был советую прочитать книгу learning javascript design patterns, я читал шаблон фабрики дизайна и наткнулся на следующую трудности, просто посмотри на ниже сценарии:Возвращает переменную как функцию-конструктор.

// 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); 

Этих является примером я нашел для завода шаблона проектирования, теперь моя проблема понимания следующей строки:

считая, что класс vehicleClass определяются как переменные:

VehicleFactory.prototype.vehicleClass = Car; 

ид on't понять, что возвращается в функции конструктора:

return new this.vehicleClass(options); 

хорошо тот мой только трудности и снова и снова работает над кодом, все еще does't имеет смысл для меня.

Буду признателен, если бы кто-нибудь мог это объяснить.

спасибо.

Alexander.

+0

Функция передается как переменная (функции являются первоклассными гражданами в JS), а затем вызывается позже. –

ответ

1

Что возвращается здесь не является функцией (вы правы, что это не имеет смысла). Возвращается новый объект (см. Ключевое слово new).

Если вы хотите, чтобы вернуть новый объект типа Truck, чем вы бы использовать код:

return new Truck(options) 

Однако в данном конкретном случае, тип автомобиля, который вы хотите определяется пользователем. Таким образом, this.vehicleClass относится к значению, определенному в переключателе чуть выше возврата. Другими словами, vehicleClass будет заменен на Car (соответственно Truck), если пользователи выбрали car (соответственно Truck).

Конструктор, который будет называться, будет таким образом либо конструктором , либо Truck, определенным в первых строках кода.

Надеюсь, теперь это яснее.

+0

Ur freaking awesome !! Спасибо –

+0

Спасибо, что отметили мой ответ как действительный, однако я не эксперт Javascript (хотя я использовал его несколько раз), и я думаю, что комментарии ниже следует внимательно прочитать. Особенно это касается того, что функции могут быть возвращены как объекты в javascript. Следовательно, хотя мой ответ может помочь понять проблему, кажется, что это, по крайней мере, частично неверно, когда я заявляю, что «то, что возвращается здесь, не является функцией». – Tabs

1

То, что вы назначаете VehicleFactory.prototype.vehicleClass, является не фактическим class, а ссылкой на constructor function.

Чтобы создать объект в JavaScript, за новым оператором должна следовать функция конструктора. Начиная с VehicleFactory.prototype.vehicleClass или позже в коде this.vehicleClass, содержится ссылка на функцию-конструктор, вы можете создать новый объект транспортного средства с помощью new this.vehicleClass(options).

Одним из больших преимуществ JavaScript является возможность передавать функции в качестве аргументов без необходимости делегатов.

Надеюсь, это немного упростит.

Привет

1

В Javascript Функции являются объектами, поэтому они могут использоваться как возвращаемые значения. Это означает, что функции не нужно возвращать какое-то значение данных или массив данных в результате его выполнения.

Функция может возвращать еще одну специализированную функцию, или она может создавать другую функцию по требованию, в зависимости от некоторых входов. Вот простой пример: функция выполняет некоторую работу, возможно, некоторую разовую инициализацию, а затем работает над ее возвращаемым значением. Возвращаемое значение случается еще одна функции, которая также может быть выполнена:

var setup = function() { 
    alert(1); 
    return function() { 
     alert(2); 
    }; 
}; 
// using the setup function 
var my = setup(); // alerts 1 
my(); // alerts 2 

Поскольку установки() обертывании возвращаемой функции, она создает замыкание, и вы можете использовать это замыкание, чтобы сохранить некоторые личные данные, который доступен возвращенной функцией, но не внешним кодом. Примером может служить счетчик, который дает вам измененное значение каждый раз, когда вы называете его:

var setup = function() { 
    var count = 0; 
    return function() { 
     return (count += 1); 
    }; 
}; 
// usage 
var next = setup(); 
next(); // returns 1 

Источник: JavaScript Patterns По Stoyan Stefanov.

И в вашем случае return new this.vehicleClass(options);, возвращает новый объект. Вызов конструктора vehicleClass.

Смежные вопросы