Programmazione ad oggetti con Function – Introduzione

Le funzioni in JavaScript offrono la possibilità di definire ed eseguire operazioni che variano dalla semplice esecuzione di una sequenza di algoritmi, alla gestione di chiamate AJAX o eventi del DOM.

Vediamo ora come poterle applicare alla metodologia della programmazione orientata ad oggetti.

Il cuore del ragionamento ruota intorno alla parola chiave di istanza di una funzione, che ne rappresenta l’esecuzione contestualizzata a particolari valori. Se ad esempio generassimo due istanze di una funzione (o classe) Persona, ognuna di loro avrà la sua proprietà nome, cognome, ecc… indipendentemente valorizzato.


Supponiamo ora di voler gestire una lista di semplici aziende e per ognuna specificare le informazioni sulla sede, dipendenti, manager e quant’altro. Definiremo quindi delle funzioni, che prenderanno il nome più appropriato di classi, che ci daranno gli strumenti per stabilire cosa è un dipendente, un manager, ecc… e quali operazioni si possono fare su di loro.

Scriveremo le funzioni in maiuscolo per far capire che sono la definizione di classi e non metodi da usare con un particolare oggetto o evento.

function Employee (params) {
  var params = params || {};
  this.id = params.id;
  this.name = params.name;
  this.company = params.company;
  this.role = params.role;
  this.manager = params.manager;
}
function Manager (params) {
  var params = params || {};
  this.id = params.id;
  this.name = params.name;
  this.company = params.company;
  this.employees = params.employees;
  this.project = params.project;
}

La prima cosa che si può notare è l’uso della parola chiave this, che serve a specificare che quella variabile di seguito al punto è legata all’istanza della funzione che poi genereremo, e della variabile params che ci serve solo come appoggio per definire un valore di default.

Per poter ora usare queste funzioni come classi e quindi istanziarne oggetti, abbiamo a disosizione la parola chiave new.

var e1 = new Employee({
  name: "John",
  role: "developer",
  company: "Blu Note"
});
var e2 = new Employee();
var m1 = new Manager({
  name: "Riccardo",
  employees: [e1],
  project: "Awesome site"
});

Per poter leggere e scrivere poi le proprietà di ogni istanza basterà usare la notazione puntuale come se fossero dei JSON

e1.name // "John"
e1.role // "developer"

e2.name // undefined

m1.project // "Awesome site"

Possiamo inoltre controllare se una certa variabile sia una istanza di una determinata classe in questa maniera

e1 instanceof Employee // true
e2 instanceof Employee // true
m1 instanceof Employee // false

Proviamo ora ad aggiungere alla classe Employee la gestione del salario, aggiungendo una nuova proprietà salary e un metodo per aggiungere gli aumenti.

function Employee (params) {
  var params = params || {};
  this.id = params.id;
  this.name = params.name;
  this.company = params.company;
  this.role = params.role;
  this.manager = params.manager;
  this.salary = params.salary;
  this.addToSalary = function (value) {
    this.salary = this.salary? this.salary + value: value;
    return this.salary
  }
}

All’interno della funzione addToSalary possiamo accedere ai valori delle proprietà di classe, in questo caso a salary, dato che non varia il contesto del chiamante della funzione add rispetto all’istanza.