Polimorfismo in Javascript

Chi e' affetto da object-orientation syndrome come me, puo' trovare utile create gerarchie di oggetti in Javascript

// Costruttore (ctor) della classe base
function Base(name) {
  this.name = name || "defaultBaseName";
}

// I metodi della classe base
Base.prototype = {
  hello : function() {
    alert("base hello :" + this.name);
  }
}

// Costruttore (ctor) della classe derivata
function Der1(name, count) {
  // Chiamiamo il ctor della classe base
  // utilizzando il metodo call
  Base.call(this, name);
  this.count = count;
  
}

// Der1 "eredita" i metodi e le proprieta' di Base
Der1.prototype = new Base();

// Creiamo una funzione con i metodi specifici di Der1
var der1Methods = function() {
  this.my = function() {
    this.hello();
    alert("der1 " + this.name + " count = " + this.count);
  }

  // Creaiamo un getter, non possiamo usare
  // la sintassi "get theSimpleName"
  // cosi' utilizziamo direttamente
  // la proprieta' __defineGetter__
  this.__defineGetter__("theSimpleName", function() {
    return this.name;
  })
  
  // Commentando questo metodo la proprieta' theSimpleName
  // diventa di sola lettura
  this.__defineSetter__("theSimpleName", function(name) {
    this.name = name;
  })
};

// Applichiamo i metodi al prototipo di Der1
der1Methods.apply(Der1.prototype);

Ed ecco un semplice test di quando scritto sopra

function test() {
  try {
  var d = new Der1("der_name", 65);

  d.my();
  alert("1--> " + d.theSimpleName);
  d.theSimpleName = "new name";
  alert("2--> " + d.theSimpleName);
  } catch (err) {
      alert("error " + err);
  }
}

Syndicate content