JavaScript – Vantaggi dell’object letterale

Ho letto che, invece di scrivere semplicemente un sacco di funzioni, dovrei usare l’object letterale.

Qualcuno può spiegare quali sono i vantaggi dell’object letterale con gli esempi, perché non ho capito fino ad ora.

Grazie

Come ha detto Russ Cam, eviti di inquinare lo spazio dei nomi globale, che è molto importante in questi giorni di combinazione di script da più posizioni (TinyMCE, ecc.).

Come ha detto Alex Sexton, è anche un’ottima organizzazione del codice.

Se stai usando questa tecnica, ti suggerirei di utilizzare il modello del modulo. Questo usa ancora i letterali degli oggetti, ma come valore di ritorno da una funzione di scoping:

var MyThingy = (function() { function doSomethingCool() { ... } function internalSomething() { .... } function anotherNiftyThing() { // Note that within the scoping function, functions can // call each other direct. doSomethingCool(); internalSomething(); } return { doSomethingCool: doSomethingCool, anotherNiftyThing: anotherNiftyThing }; })(); 

Uso esterno:

 MyThingy.doSomethingCool(); 

La funzione di scoping è racchiusa tra tutte le tue funzioni, quindi la chiami immediatamente e memorizzi il suo valore di ritorno. vantaggi:

  • Le funzioni sono dichiarate normalmente e quindi hanno nomi . (Mentre con il formato {name: function() { ... }} , tutte le funzioni sono anonime, anche se le proprietà che le fanno riferimento hanno nomi.) I nomi degli strumenti di aiuto aiutano a mostrare gli stack di chiamata in un debugger a dicendoti quale funzione ha generato un’eccezione. (Aggiornamento 2015: l’ultima specifica JavaScript, ECMAScript 6a edizione, definisce un gran numero di modi in cui il motore JavaScript deve inferire il nome di una funzione. Uno di questi è quando la funzione viene assegnata a una proprietà come nel nostro {name: function() { ... }} . Così come i motori implementano ES6, questo motivo andrà via.)
  • Ti dà la libertà di avere funzioni private utilizzate solo dal tuo modulo (come il mio internalSomething sopra). Nessun altro codice sulla pagina può chiamare quelle funzioni; sono veramente privati. Solo quelli che esporti alla fine, nell’istruzione return, sono visibili al di fuori della funzione scoping.
  • Rende semplice il ritorno di diverse funzioni a seconda dell’ambiente, se l’implementazione cambia completamente (come materiale IE-vs-W3C, o SVG vs. Canvas, ecc.).

Esempio di restituzione di diverse funzioni:

 var MyUtils = (function() { function hookViaAttach(element, eventName, handler) { element.attachEvent('on' + eventName, handler); } function hookViaListener(element, eventName, handler) { element.addEventListener(eventName, handler, false); } return { hook: window.attachEvent ? hookViaAttach : hookViaListener }; })(); MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */); 

L’utilizzo di un object letterale (alias modello letterale dell’object) non inquinerà lo spazio dei nomi globale tanto severamente quanto l’utilizzo di molte funzioni dichiarate globalmente e aiuterà anche a organizzare il codice in modo logico

Ad esempio, questo object letterale

 var obj = { find : function(elem) { /* find code */ }, doSomething: function() { /* doSomething code */ }, doSomethingElse: function() { /* doSomethingElse code */ } } 

rispetto a

 function find(elem) { /* find code */ }, function doSomething() { /* doSomething code */ }, function doSomethingElse() { /* doSomethingElse code */ } 

creerà solo una proprietà sull’object globale rispetto a tre. È quindi ansible utilizzare facilmente le funzioni in questo modo

 obj.doSomething(); 

Rebecca Murphey ha tenuto un discorso su Object Literals alla conferenza jQuery di quest’anno. Uno dei migliori motivi per usarli è semplicemente una buona organizzazione del codice.

Ecco come Rebecca scrive sull’Obi letteral Pattern: http://rmurphey.com/blog/2009/10/15/using-objects-to-organize-your-code/

Ho sempre usato i letterali degli oggetti perché sono un modo chiaro per organizzare il codice. Ecco perché non mi piace il prototipo, è troppo disordinato.

Le funzioni non perfezionano lo spazio dei nomi come qualcuno menzionato sopra più di un object letterale.

Si potrebbe facilmente scrivere un letterale come

 var obj = {} var find = function(elem) { /* find code */ }, var doSomething = function() { /* doSomething code */ }, var doSomethingElse = function() { /* doSomethingElse code */ } 

che sarebbe poluto creando molti oggetti globali uguali alle funzioni. allo stesso modo potresti fare:

 (function() { function find(elem) { /* find code */ }, function doSomething() { /* doSomething code */ }, function doSomethingElse() { /* doSomethingElse code */ } })(); 

che non creerebbe quegli oggetti globali (tutto è un object in JS)

in questo modo non crei ancora un sacco di oggetti globali.

A mio avviso, i letterali degli oggetti hanno due vantaggi. Uno sono utilizzati da molti plugin come jQuery, quindi le persone sono più familiari e sono facili da leggere. Rendendoli facili da passare attraverso i dati in un plugin. È facile creare metodi sia pubblici che privati ​​….

Possono essere lenti anche se ogni volta che crei un’istanza dell’object tutti i suoi metodi sono duplicati. Ho capito che non è il caso del prototipo in quanto si dispone di una copia dei metodi e i nuovi oggetti fanno semplicemente riferimento al prototipo.

Naturalmente potrei sbagliarmi…