Javascript возврат с двоеточием


Я изучаю JavaScript и наткнулся на структуру ниже:

var Test = (function () {

  function func1() {
      //do something.....
  }

  function func2() {
      //do something.....
  }

  function func3() {
      //do something.....
  }

  return {
      func1: func1,
      func2: func2,
      func3: func3
  };

})();

Мне интересно, что делает блок возврата. Это очень часто используемая структура JavaScript? Пожалуйста, дайте мне знать, где я могу получить дополнительную информацию об этом.

3 54

3 ответа:

это Выявление Шаблона Модуля.

возвращаемый объект содержит ссылки на функции, определенные внутри IIFE. Таким образом, функции, определенные внутри частная к анонимной функции.

но если вы хотите использовать внутренние функции снаружи, вы можете использовать возвращенный объект.

значение Test будет

var Test = {
    func1: func1,
    func2: func2,
    func3: func3
};

и вы можете назвать func1 извне как

Test.func1();

это путь Javascript повторитькласс. Как нет видимость спецификаторы используя шаблон модуля, переменные / методы можно сделать общедоступными / частными.

enter image description here

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

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

из книги изучение шаблонов проектирования Javascript

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

плюсы:

  1. инкапсуляция. Код внутри жизни инкапсулируется из внешнего мира
  2. чистый, организованный и многоразовый код
  3. конфиденциальность. Это позволяет создавать частные переменные / методы. Частные переменные / методы не могут быть затронуты извне IIFE.

недостатки:

  1. если частная функция относится к публичной функции, эта публичная функция не может быть переопределена

далее Чтение:

  1. https://en.wikipedia.org/wiki/Module_pattern
  2. https://carldanley.com/js-revealing-module-pattern/
  3. как использовать выявление шаблона модуля в JavaScript

EDIT

С комментарий С @Mike

следует отметить, что обычно для создания объекта (например,var me = {};) а затем объявить потенциальных публичных членов на нем (me.func1 = function() { /* ... */ };), возвращая этот объект в конце (return me;). Это позволяет избежать повторения, которое мы видим в инструкции return кода OP (где все публичные вещи повторяются).

это литеральный объект в инструкции return. Это как создать объект, а затем вернуть его:

var obj = {
    func1: func1,
    func2: func2,
    func3: func3
};
return obj;

синтаксис объекта literal создает объект и задает его свойства, например:

var obj = new Object();
obj.func1 = func1;
obj.func2 = func2;
obj.func3 = func3;
return obj;

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

когда не используются частные переменные, код делает то же самое вещи, как:

var Test = {
  func1: function() {
      //do something.....
  },
  func2: function() {
      //do something.....
  },
  func3: function() {
      //do something.....
  }
};

частные переменные объявляются внутри области действия функции и доступны только для функций внутри нее. Пример:

var Test = (function () {

  var name;

  function setName(str) {
    name = str;
  }

  function getName() {
    return name;
  }

  return {
      setName: setName,
      getName: getName
  };

})();

Test.setName("John Doe");
var name = Test.getName();

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