follow me on Twitter

    Javascript Object Composition

    Nella programmazione ad oggetti spesso si sente l'esigenza di comporre gli oggetti anziche creare complesse gerarchie di codice e per questo sono state introdotte tutta usa serie di tecniche oltre a nuove caratteristiche dei linguaggi stessi. Ad esempio se avessi voluto"Mescolare" del codice in Ruby per ottenere un nuovo oggetto con le caratteristiche risultati (e senza dover usare un foglio A3 per disegnarne l'albero genealogico ;-)) avrei avuto a mia disposizione i Mixin, qualcosa del tipo:
    
    module InutilityModule
    def important_method
      @obj_var = 5
    end
    end
    
    class TClass
    include InutilityModule
    
    def initialize
      @obj_var2 = 2
    end
    
    def add
       return @obj_var2+@obj_var
    end
    end
    
    Le istanze della classe TClass avranno il metodo important_method oltre ai propri. In JavaScript le cose vanno un po' diversamente in quanto non ci sono classi ma oggetti prototipo, e inoltre gli oggetti altro non sono se non Hash tables. Se vogliamo aggiungere un metodo ad un oggetto JavaScript ci basta definirne la nuova proprietà:
    
    var myobj = {
    method1: function() {
      this._var1 = 5;
    }
    };
    
    myobj.method2 = function() {
    this._var2 = 3;
    }
    
    myobj["method3"] = function() {
    alert(this._var1+this._var2);
    }
    
    alle volte pero' mi e' capitato di doverne aggiungere un gruppo e quindi per pulizia ciclo su tutti gli attributi dell'oggetto sorgente:
    
    var codetomix = {
    method2: function() {
      alert("method2");
    },
    
    method3: function() {
      alert("method3");
    }
    }
    
    for (var property_name in codetomix) {
    myobj[property_name] = codetomix[property_name];
    }
    
    volendo (come fanno molti framework javascript) si puo' incapsulare la funzionalita' in una funzione di comodo:
    
    function apply(src, dst) {
    for (var prop in src) {
      dst[prop] = src[prop];
    }
    }
    
    apply(codetomix,myobj);
    
    chiaramente questa versione di "apply" è moooolto minimale ma nella sua minimalita' puo' essere molto utile quando non si vuole ricorrere all'implementazione di un particolare framework (che introduce in genere una maggiore complessita' avendo come obiettivo quello di realizzare l'ereditarietà alla maniera classica) IMHO la cosa simpatica di snippet come questo è che rendono evidente la propensione a scheme del design di JavaScript ;-)

    0 commenti:

    View Luca Greco"s profile on LinkedIn

    Rpl

    La mia foto
    Lecce, Italy
    Fulltime Coder and *nix BOFH