2013-06-15 3 views
4

Так что я работаю над некоторым кодом прямо сейчас, и есть этот код, который я пытаюсь понять. Я немного читал об этом, и кажется, что код использует объектные литералы. Итак, вот код.Попытка уточнить этот код javascript

var car = function(){ 

    // ... 
    function drive(model, color){ 
     // ... do something 
    } 
    // ... 

    return { 
     start: drive 
    } 

}(); 

Вызывается в другом файле в другом месте

car.start(audi, black); 

Так как это работает. Сначала кажется, что в javascript класс может иметь метод возврата, а не только метод. Также метод возврата вызывает метод? используя объектные литералы? Я немного смущен.

+1

btw, http://eloquentjavascript.net/ хорошо читается :) – mb21

ответ

2

Это шаблон инкапсуляции.

  1. Объекты: Там нет классов в JavaScript, то только объекты. car содержит объект со структурой, видимой в инструкции return.
  2. Функции: Внешняя функция является анонимной (без имени) и непосредственно вызывается после определения (скобки в конце).
  3. Локальный масштаб: Функция drive существует только в рамках окружающей функции. Вы не можете позвонить drive со стороны.
  4. Инкапсуляция: С помощью оператора return вы можете контролировать, какие функциональные возможности будут доступны снаружи и как они помечены. Следовательно, car является объектом с одним атрибутом с именем start, который является определением функции drive.

Если вы звоните car.start без скобок вы получаете само определение функции:

function (model, color) { 
    ... 
} 

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

Если вы вызываете car.start(audi, black), вы выполняете функцию с заданными параметрами и получаете то, что возвращается функцией drive.

+0

Отлично, спасибо Alp. Теперь имеет смысл. –

3

Во-первых, кажется, что в JavaScript класс

JavaScript не имеет классов. Самое близкое, что у них есть к ним, - это функции конструктора, но у вас их нет.

Так как это работает

car является возвращаемым значением анонимной функции, которая вызывается, как только она определена (она имеет () после закрытия }).

Это возвращаемое значение является объектом, созданным с использованием литерала объекта.

Значение свойства start данного объекта является функцией drive. Функции являются объектами первого класса в JavaScript, поэтому их можно передавать так же, как и любой другой объект.

+0

Спасибо Квентин, теперь это имеет больше смысла. –

+0

@MichaelNana - посмотреть его в действии в консоли браузера здесь: http://jsfiddle.net/pratik136/Gbg4R/ – bPratik

+0

+1 приятный ответ. – Vinay

1

Как вы думаете, что вы устанавливаете объект автомобиля, вы вызываете функцию диска из другого файла и передаете значения audi и black через переменную модель и цвет. Затем вы возвращаете экземпляр объекта («start») с переменными и действиями, находящимися внутри него.

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