Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Javascript - domanda OOP
Forum - Javascript - domanda OOP

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 12:53
Domenica, 03/09/2017
Salve ragazzi, chiedevo come posso utilizzare le classi in javascript?

Mi sa che perdo qualche passaggio o sono confuso su alcune nozioni che ho letto sul manuale.

Normalmente per dichiarare una classe faccio in questo modo

Codice sorgente - presumibilmente Javascript

  1. Function test() {};
  2.  
  3. test.prototype.esegui = funciont()
  4. {
  5. };
  6.  
  7. test.esegui();



Ma ho visto anche altri modi del tipo

Codice sorgente - presumibilmente Plain Text

  1. Test = {
  2.  
  3.  .....
  4.  
  5. }



Che differenza c'è tra i due modi?
E quale sistema conviene usare di più?

Ultima modifica effettuata da Thejuster il 03/09/2017 alle 12:54


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:14
Domenica, 03/09/2017
Disclaimer: Javascript non e' un linguaggio ad oggetti.

Il modo corretto e' il primo che hai riportato.

Se usi il secondo:

Codice sorgente - presumibilmente Delphi

  1. var A = {
  2.   test: function(){ console.log("test"); }
  3. };
  4.  
  5. var istanza = new A(); // errore: Uncaught TypeError: A is not a constructor



Non hai creato una classe, hai semplicemente definito un oggetto con una funzione.

Se vuoi usare Javascript in stile OOP, e' consigliabile usare una libreria come prototype: http://prototypejs.org/ e tenere sempre in mente che non riuscirai mai ad avere a pieno tutte le caratteristiche dell'OOP. Javascript e' un linguaggio funzionale, non OOP.

Ultima modifica effettuata da pierotofy il 03/09/2017 alle 15:15


Il mio blog: https://piero.dev
PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 17:10
Martedì, 05/09/2017
dai un occhio a questo: https://www.typescriptlang.org :k:

PM Quote
Avatar
R0gerBlack (Member)
Expert


Messaggi: 210
Iscritto: 10/06/2010

Segnala al moderatore
Postato alle 23:20
Martedì, 05/09/2017
Testo quotato

Postato originariamente da pierotofy:

Disclaimer: Javascript non e' un linguaggio ad oggetti.

[...]

Non hai creato una classe, hai semplicemente definito un oggetto con una funzione.

Se vuoi usare Javascript in stile OOP, e' consigliabile usare una libreria come prototype: http://prototypejs.org/ e tenere sempre in mente che non riuscirai mai ad avere a pieno tutte le caratteristiche dell'OOP. Javascript e' un linguaggio funzionale, non OOP.



Ma JavaScript dallo standard ES6 non si può considerare OOP?

Ecco un valido codice ES6:

Codice sorgente - presumibilmente C++

  1. class AClass {
  2.  
  3.   constructor(id) {
  4.     this.id = id;
  5.   }
  6.  
  7.   esegui() {
  8.     console.log(`Esegui (id: ${this.id})`);
  9.   }
  10. }
  11.  
  12. const a1 = new AClass(1);
  13. const a2 = new AClass(20);
  14.  
  15. a1.esegui();
  16. a2.esegui();



Ed ecco l'output dalla console

Codice sorgente - presumibilmente Plain Text

  1. $ node index.js
  2. Esegui (id: 1)
  3. Esegui (id: 20)



Le classi in ES6 non presentano tutte le features "standard" dei linguaggi OOP, ma includono l'ereditarietà che è uno degli elementi chiave del paradigma. L'incapsulazione normale viene a mancare, ma ci sono dei workaround con le closure:

Codice sorgente - presumibilmente VB.NET

  1. class SimpleDate {
  2.   constructor(year, month, day) {
  3.     // Check that (year, month, day) is a valid date
  4.     // ...
  5.  
  6.     // If it is, use it to initialize "this" date's ordinary variables
  7.     let _year = year;
  8.     let _month = month;
  9.     let _day = day;
  10.  
  11.     // Methods defined in the constructor capture variables in a closure
  12.     this.addDays = function(nDays) {
  13.       // Increase "this" date by n days
  14.       // ...
  15.     }
  16.  
  17.     this.getDay = function() {
  18.       return _day;
  19.     }
  20.   }
  21. }


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 0:43
Mercoledì, 06/09/2017
Effettivamente allo stato attuale sembrerebbe possibile abbandonare quegli abominevoli costrutti che cercavano di simulare le classi, e poter finalmente usufruire delle features di ECMA 6.
https://kangax.github.io/compat-table/es6/

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:36
Mercoledì, 06/09/2017
Un linguaggio OOP deve avere incapsulamento, ereditarieta' e polimorfismo. Javascript (anche il nuovo standard ES6) non fornisce l'incapsulamento (no, neanche tramite l'uso delle closures, perche' posso sempre sovvrascrivere una closure).


Il mio blog: https://piero.dev
PM Quote