OOP E PROTOTYPE IN JAVASCRIPT
La programmazione orientata agli oggetti è un paradigma che mette al centro gli oggetti anziché le funzioni. Guardiamo l’immagine sotto riportata.
COSA SONO GLI OGGETTI?
Gli oggetti sono strutture dati che integrano al loro interno variabili e funzioni. Le variabili prendono il nome di proprietà e le funzioni si chiamano metodi. I quattro pilastri della OOP sono riportati nell’immagine a fianco.
INCAPSULAMENTO
Incapsulare vuol dire chiudere in una capsula. Si raggruppano dati e funzioni correlati. Le funzioni o metodi lavorano internamente con i dati per eseguire le operazioni richieste.
ASTRAZIONE
Il concetto di astrazione si basa sul “cosa”. l’obbiettivo dell’astrazione è esporre l’essenziale e nascondere le complessità. Prendiamo come esempio un lettore DVD, tale dispositivo elettronico espone una interfaccia utente costituita dai pulsanti start, stop, pausa etc. ma nasconde le complessità hardware che ne stanno dietro.
EREDITARIETA’
Tramite l’ereditarietà un oggetto può accedere a proprietà e metodi di un altro oggetto evitando la duplicazione del codice.
POLIMORFISMO
Il polimorfismo letteralmente significa avere molte forme. Uno stesso metodo di nome m può avere comportamenti diversi in base al contesto in cui opera.
Riassumo brevemente con l’immagine sotto.
ACCESSO ALLE PROPRIETA’ DI UN OGGETTO
Come sappiamo per accedere alle proprietà degli oggetti si usa la dot notations, ossia nomeoggetto.nomeproprietà. Guardiamo il codice sotto riportato per chiarire il concetto.
DA OGGETTO LETTERALE A CONSTRUCTION FUNCTION
A volte per evitare inutili duplicazioni di codice si possono usare quella che vengono chiamate factory function o meglio delle constructor function. Guardare il codice riportato sotto.
NASCONDERE I DETTAGLI ED ESPORRE SOLO L’ESSENZIALE
Vediamo come in JS si possa semplicemente implementare uno dei quattro pilastri della OOP, l’astrazione. Codice in basso.
CATENA DEI PROTOTIPI
Il meccanismo in JS dell’ereditarietà è implementato attraverso la catena dei prototipi. Tramite essa un oggetto può accedere a proprietà e metodi di un altro oggetto. Con questo meccanismo evitiamo la duplicazione del codice, ne obj2 ne obj3 hanno bisogno di definire il metodo fn1() a meno che non debbano ridefinirlo. Guardare le due figure in basso.
ESEMPIO DI CODICE
Vediamo un esempio su una catena di prototipi.
CATENA DEI PROTOTIPI RIPORTATI NEL CODICE
LA PROPRIETA’ __PROTO__
Utilizzando __proto__ su un oggetto possiamo risalire al suo prototipo. Aggiungendo tutta una serie di istruzioni __proto__ possiamo risalire la catena dei prototipi. È deprecato, per conoscere il prototipo di un oggetto usare getPrototypeOf.
CODICE DI ESEMPIO
SETPROTOTYPEOF E GETPROTOTYPEOF
LA KEYWORD THIS
this è il riferimento all’attuale contesto di esecuzione, ovvero l’oggetto nella quale stiamo operando. La prima cosa che il motore JS fa prima dell’esecuzione della prima riga di codice è creare un contesto globale di esecuzione ovvero un oggetto globale in cui tutto il nostro codice viene eseguito, e fa sì che this sia un riferimento a questo oggetto globale (window). Il valore di this all’interno di una funzione dipende da come viene invocata.
BINDING ESPLICITO CON BIND, CALL E APPLY
Tramite binding esplicito è possibile fare in modo che this si riferisca a un certo oggetto. Call e Apply lavorano pressochè allo stesso modo, invece Bind prende in input l’oggetto a cui this deve riferirsi e resituisce una riferimento alla funzione.