Ci sono vantaggi pratici dall'incapsulamento di JS all'interno di class.create?

3

Sto lavorando a questa applicazione web che ha già un meccanismo che consente a uno sviluppatore di definire le funzioni JavaScript lato server che possono quindi essere chiamate da un altro codice JS lato server.

Ci sono due modi per definire queste funzioni.

In questo modo ...

function iAmFunctionA(arg) {
   ...some code...
}

function iAmFunctionB(arg) {
   ...some other code...
}

... e tramite un'opzione che incapsula le funzioni all'interno di un oggetto separato (penso che questo sia dovuto al fatto che l'applicazione Web ha incorporato Prototype.js) ...

var iAmAClass = Class.create();
   iAmAClass.prototype = {
      iAmFunctionA: function(arg) {
         ...some code...
      },

      iAmFunctionB: function(arg) {
         ...some other code...
      },

   type: 'iAmAClass'
}

Quest'ultimo tipo viene quindi chiamato da altri JS lato server in questo modo:

var a = new iAmAClass();
var someRetVal = iAmAClass.iAmFunctionA(arg);

La domanda che volevo porre è: ci sono dei benefici pratici dall'incapsulare JavaScript all'interno di un oggetto, e in tal caso, quale sarebbe?

    
posta x457812 02.12.2015 - 13:43
fonte

1 risposta

3

Penso che stia davvero cercando di mettere il pensiero orientato agli oggetti in JavaScript. Il tuo codice sembra proprio come questo esempio: Creare un costruttore di classi JavaScript orientato agli oggetti da HTML Goodies.

La programmazione orientata agli oggetti è una tecnica organizzativa. Se hai una struttura dati utente, potrebbe avere campi come:

firstName
lastName
age

Potresti avere funzioni che funzionano con Utenti come,

createUser()
deleteUser()
changeFirstName()
addUserToCompany()

Potresti semplicemente lanciare tutte queste cose in giro per nulla, o potresti mettere tutti i dati e le funzioni relativi all'utente in un unico posto: una classe utente. Forse quell'ultima funzione addUserToCompany() appartiene più alla classe Company che alla classe User. Non è un sistema perfetto. Ma non dovresti cercare quella funzione ovunque ma le classi User e Company, quindi almeno si restringe dove vorresti cercare le cose.

L'incapsulamento di solito significa (approssimativamente) "nascondersi". Nascondi le cose per limitare i modi in cui possono essere utilizzate. Se qualcosa non ha parti mobili, è meno probabile che si rompa. Quindi nascondi tutte le cose sensibili - si spera in modo più efficace di quanto vorresti aggiungendo un commento come // Don't touch this!

Sfortunatamente, tutto in JavaScript è globale, visibile e mutabile. L'unico modo per incapsulare le cose in JavaScript è metterle all'interno delle funzioni. Non ottieni la maggior parte delle garanzie / vantaggi di OOP in JavaScript. Ma alcune persone come OOP. Alcuni problemi sono meglio risolti con OOP, anche se l'uso di JavaScript in questo modo è un po 'artificiale.

Quello che vedi qui è qualcuno che crea dati e funzioni all'interno di una chiusura per rendere meno pubblici i dettagli di quelle cose. Non sono sicuro di quanto sia efficace, dal momento che gli oggetti JavaScript non forniscono quasi garanzie.

Molto probabilmente, il vantaggio in questo caso è che la persona che ha scritto il codice arriva a pensare sul codice nel modo in cui sono abituati a pensare in un linguaggio orientato agli oggetti come Java. Se ti piace pensare in questo modo, allora ti aiuta. In caso contrario, non vedo il vantaggio di provare a fare OOP anche in JavaScript.

Ma se la tua domanda riguarda specificamente l'incapsulamento, allora come ha detto Robert Harvey, è quasi sempre una buona cosa. E mettere le cose dentro le funzioni (o "chiusure") è l'unico modo per incapsulare in JavaScript (almeno fino a ES6).

    
risposta data 02.12.2015 - 22:49
fonte

Leggi altre domande sui tag