Javascript è un linguaggio ad oggetti, anche se per la massima parte l'uso che se ne fa è quello di scrivere piccole e semplici funzioni con un paradigma procedurale. In effetti scrivere ad oggetti per mezzo di javascript è molto diverso dallo scrivere in un comune linguaggio object-oriented. Molti dei principi di questo tioo di programmazione trovano applicazione solo per mezzo di stratagemmi, come ad esempio nel caso dell'ereditarietà.

La nuova libreria Microsoft AJAX Library, introduce una serie di utility che semplificano questo lavoro e consentono un uso più produttivo del paradigma object-oriented anche in ambito scripting. Per creare una classe in Javascript si può procedere in svariati modi, tuttavia facendo uso della libreria AJAX il metodo consigliato è quello dell'uso del prototype pattern come segue:

   1: MyClass = function()
   2: {
   3:     // costruttore della classe
   4: }
   5:  
   6: MyClass.prototype =
   7: {
   8:     // corpo della classe
   9: }

Le poche righe qui riportate mostrano lo scheletro di classe che si può realizzare facilmente anche senza l'uso della Microsoft AJAX Library. Possiamo facilmente aggiungere un metodo facendo uso della sintassi propria di JSON. Proviamo ad esempio a verificare che esista un effettivo incapsulamento delle informazioni dichiarando un campo "privato" e un metodo che dimostra il valore ad esso assegnato:

   1: MyClass = function(message)
   2: {
   3:     this._message = message;
   4: }
   5:  
   6: MyClass.prototype =
   7: {
   8:     display : function()
   9:     {
  10:         alert(this._message);
  11:     }
  12: }
  13:  
  14: // USO : --------------
  15:  
  16: var msg = new MyClass("Hallo World!");
  17: msg.display();

Il piccolo esempio riportato oltre a dimostrare le potenzialità di questa tecnica, ne dimostra anche i limiti. Ad esempio è piuttosto evidente che il campo "_message" che pur nella nostra immaginazione è evidentemente un campo privato, è facilmente accessibile dall'esterno. Non vi è naturalmente alcun modo di impedirlo, semplicemente perchè in javascript non esistono i modificatori di accesso, ma per convenzione nella libreria Microsoft l'uso di un trattino di sottolineatura sottintende che esso non debba mai essere usato esternamente.

Un'altro rilievo da notare è che l'uso della keyword "this" è obbligatorio. La sua omissione induce l'interprete a cercare una variabile globale con lo stesso nome e tutti noi sappiamo che in programmazione object-oriented di variabili globali non ve n'è traccia alcuna. Infine è da tenere in considerazione che la classe non può specificare una base e che di conseguenza non esiste override.

L'adozione della Microsoft AJAX Library ci da una serie di strumenti che ci permettono di simulare facilmente alcune delle "feature" della programmazione ad oggetti. Tanto per cominciare potremmo organizzare le nostre classi in namespace, dando ad esse una migliore leggibilità:

   1: Type.registerNamespace('Elite');
   2:  
   3: Elite.ButtonBehavior = function(element)
   4: {
   5:     this._element = element;
   6: }
   7:  
   8: Elite.ButtonBehavior.prototype = 
   9: {
  10:     ...
  11: }

La classe "Type" consente di creare un namespace fittizio che poi in seguito dovremmo riportare diligentemente in tutte le ricorrenze del nome. A questo punto ci dovremmo chiedere come fare ad estendere una nostra classe. Facciamo l'ipotesi di aver creato una classe che contenga delle funzioni base per il trattamento di elementi di interfaccia. Tale classe si chiamerà Elite.BaseElement. Mediante i metodi statici alle classi potremmo registrare la nuova classe creata ed assegnare ad essa una base:

   1: Elite.ButtonBehavior.registerClass('Elite.ButtonBehavior', Elite.BaseElement)

Per poter dire di aver completato la nostra classe non ci resta che adoperarci per fare in modo che avvenga l'invocazione dei metodi base. Non dimentichiamo infatti che si tratta pur sempre di una simulazione e quindi qualcosa da fare c'è, soprattutto per quanto riguarda il costruttore:

   1: Type.registerNamespace('Elite');
   2:  
   3: Elite.ButtonBehavior = function()
   4: {
   5:     Elite.ButtonBehavior.initializeBase(this);
   6: }
   7:  
   8: Elite.ButtonBehavior.prototype = 
   9: {
  10:     initialize : function()
  11:     {        
  12:         Elite.ButtonBehavior.callBaseMethod(this, 'initialize');
  13:     }
  14: }
  15:  
  16: Elite.ButtonBehavior.registerClass('Elite.ButtonBehavior', Elite.BaseElement);

Lo scheletro della classe è pronto. Non resta che aggiungere i metodi necessari ricordando che in Javascript le property non esistono ma possono essere emulate con una coppia di metodi get_ e set_. La Microsoft AJAX Library infatti istituzionalizza anche questo consentendo ad esempio in fase di inizializzazione di assegnare i valori come vere e proprie proprietà.