Ritorna Javascript con il colon

Sto imparando JavaScript e ho trovato la struttura sotto:

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

Mi chiedo cosa sta facendo il block di return. È questa una struttura JavaScript molto diffusa? Fathemes sapere where posso get ulteriori informazioni su questo.

Questo è il Modello Rivelatore Modulo .

L'object restituito contiene riferimenti alle funzioni definite all'interno del IIFE. Quindi le funzioni definite all'interno sono private alla function anonima.

Ma se si desidera utilizzare le funzioni interne all'esterno, è ansible utilizzare l'object restituito.

Il valore del Test sarà

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

E puoi call func1 dall'esterno come

 Test.func1(); 

Questo è il modo in cui Javascript emula class . Poiché non esistono specificatori di visibilità che utilizzano il model Module, le variables / methods possono essere pubblici / privati.

immettere qui la descrizione dell'immagine

Il model del model rivelatore è ispirato dal model Modulo. Nel rivelare il model del module, restituisce solo un riferimento alle variables / methods privati in un object .

L'idea principale dietro al model evita le variables globali male . Questo sembra simile a IIFE tranne che un object viene restituito anziché la function. Le variables / methods definiti all'interno del IIFE sono riservati alla function. Per accedere a qualsiasi variabile / metodo all'interno del IIFE, deve essere aggiunto nell'object restituito e quindi è ansible accedere al di fuori di IIFE. Questo model sfrutta le chiusure , quindi le variables / methods definiti all'interno del IIFE sono accessibili anche dopo che l'object viene restituito.

Dal libro di Addy Osmani " Apprendere i templates di design Javascript"

Il model del Modello di Rivelazione è avvenuto in quanto Heilmann era frustrato dal fatto che whereva ripetere il nome dell'object principale quando volevamo call un metodo pubblico da un altro o accedere a variables pubbliche. Anche lui non amava la necessità del model di Modulo di wherer passare alla notazione letterale degli oggetti per le cose che voleva rendere pubblico.

Il risultato dei suoi sforzi è stato un model aggiornato in cui definiremo semplicemente tutte le nostre funzioni e variables nel field privato e restituire un object anonimo con puntatori alla funzionalità privata che volevamo rivelare come pubblici.

vantaggi:

  1. Incapsulamento. Il codice all'interno del IIFE è incapsulato dal mondo esterno
  2. Codice pulito, organizzato e riutilizzabile
  3. Privacy. Permette di creare variables / methods privati. Le variables / methods privati ​​non possono essere toccati dall'esterno del IIFE.

svantaggi:

  1. Se una function privata si riferisce ad una function pubblica, questa function pubblica non può essere ignorata

Ulteriori letture:

  1. https://en.wikipedia.org/wiki/Module_pattern
  2. https://carldanley.com/js-revealing-module-pattern/
  3. Come utilizzare il model di module Rivelazione in JavaScript

EDIT

Da commento da @Mike

È da notare che è comune creare un object (ad esempio, var me = {}; ) e quindi dichiarare i membri pubblici ( me.func1 = function() { /* ... */ }; ) , restituendo quell'object alla fine ( return me; ). Ciò evita la ripetizione che vediamo nella dichiarazione di return del codice OP (where tutte le cose pubbliche vengono ripetute).

È un object letterale nella dichiarazione di return. È come creare un object e poi restituirlo:

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

La syntax degli oggetti letterali crea un object e imposta le sue properties;, proprio come:

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

Lo scopo del return dell'object è quello di rivelare le funzioni all'interno della function al codice esterno, creando uno spazio per le variables private che le funzioni possono utilizzare.

Quando non utilizza variables private, il codice fa la stessa cosa:

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

Le variables private vengono dichiarate all'interno dell'ambito di function e sono raggiungibili solo dalle funzioni all'interno di esso. Esempio:

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

Funziona come una class in altri linguaggi di programmazione. Pertanto, è ansible accedere al pubblico func1 membro utilizzando Test.func1 e chiamarlo come una normale function usando Test.func1() .