Объектные литералы и функции - PullRequest
0 голосов
/ 28 ноября 2018

Я не могу найти ответ на следующие вопросы.

Моя самая большая проблема - запуск проекта, который не поддерживается в большинстве сред, в первую очередь в браузерах.Я обнаружил, что вы можете писать модули двумя различными способами: функции или литералы объекта.

Литерал объекта

var foo = {
    bar: function(){}
}

Выражение функции

var foo = function(){
    var bar = function (){};
    return{
        method: bar
    }
}

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

Полу новичок в JS, так что, возможно, я пересекаю некоторые провода.Помимо способности сделать внутренних членов частными, есть ли другие различия в обозначениях?Из того, что я прочитал, оба могут следовать шаблону, наблюдателю, синглтон-схеме.Единственное отличие, которое я обнаружил, было в шаблоне дизайна прототипа.

1 Ответ

0 голосов
/ 28 ноября 2018

Есть несколько терминов, которые нужно знать.Во-первых, это относится к функциям:

Объявление функции :

function foo(){

}

Объявление анонимной функции:

function(){

}

Выражение функции (где функция назначена переменной):

var foo = function(){

}

Выражение немедленного вызова функции (первый набор скобок превращает объявление анонимной функции в выражение):

(function(){

})();

Теперь, кроме функций, вы спрашиваете о Object Literal :

var foo = {
    bar: function(){}
}

vs.выражение функции:

var foo = function(){
    var bar = function (){};
    return{
        method: bar
    }
}

или даже объявление функции:

function foo(){
    var bar = function (){};
    return{
        method: bar
    }
}

Вы правы в том, что синтаксис функции может создавать закрытые члены, где у литерала объекта этого нетспособность (это просто способ группировки ключей / значений).Но еще одно важное отличие состоит в том, что функции могут использоваться в качестве конструкторов (var f = new foo()) и могут иметь прототипов , где объектные литералы не могут.Таким образом, функции часто более универсальны, когда речь идет о настройке шаблонов наследования.

...