Originariamente inviato da giuseppe500
1)E' possibile in javascript specificare il tipo dei parametri di una funzione(per tipo intendo una classe o un prototipo in js)?
in modo che chi utilizza la libreria sia guidato e obbligato a passare un valore di un tipo specifico?
L'unico modo è questo:
codice:
function addizione(addendo1, addendo2) {
if (typeof addendo1 !== "number") { throw new TypeError("First argument to function addizione must be a Number."); }
if (typeof addendo2 !== "number") { throw new TypeError("Second argument to function addizione must be a Number."); }
return addendo1 + addendo2;
}
alert(addizione(3, "ciao"));
(verrà generato un errore del browser, controlla la console degli errori di Firefox!)
Originariamente inviato da giuseppe500
2)E' possibile specificare un tipo base come parametro e costringere / guidare l'utente ad passare solo variabili di un tipo che derivi da quel tipo base?
L'unico modo è questo:
codice:
function Persona (sNome, sCognome) {
this.nome = sNome;
this.cognome = sCognome;
}
Persona.prototype.toString = function() { return this.nome + " " + this.cognome; };
function Animale (sNome, sRazza) {
this.nome = sNome;
this.razza = sRazza;
}
Animale.prototype.toString = function() { return this.nome + " (" + this.razza + ")"; };
var ospiti = [];
function aggiungiOspite(oOspite /* solo persone!! */) {
if (!(oOspite instanceof Persona)) { throw new TypeError("Solo gli esseri umani vengono contati come ospiti :-)"); }
ospiti.push(oOspite);
}
aggiungiOspite(new Persona("Guido", "Baldi"));
aggiungiOspite(new Persona("Luca", "Bianchi"));
aggiungiOspite(new Persona("Enrico", "Spina"));
alert(ospiti.join(", "));
// fin qui tutto bene
aggiungiOspite(new Animale("Bobby", "Cane"));
// qui viene generato un errore!
alert(ospiti.join(", "));
(idem)
Originariamente inviato da giuseppe500
e se non è possibile ad es se voglio passare ad una funzione un tipo creato da me come faccio a eseguire i suoi metodi?
Così:
codice:
var miaIstanza = new Tuple2();
miaIstanza.SetTuple("valore1", "valore2");
Originariamente inviato da giuseppe500
e se chiamo i metodi allo stesso modo ho il polimorfismo?
Spiegati meglio 
Originariamente inviato da giuseppe500
e se passo un altro tipo che non centra un piffero cosa succede?
Viene generato un errore. A meno che l'invocazione del metodo, invece di farla sull'oggetto, tu non la faccia sul prototipo, così:
codice:
var mioOggetto = { nome: "tizio" }; // l'oggetto non è un'istanza di Tuple2!!
Tuple2.prototype.SetTuple.call(mioOggetto, "valore1", "valore2");
A quel punto se l'errore viene generato o meno dipenderà dal metodo. In questo caso, vista la natura di SetTuple, non verrà mai generato nessun errore, qualsiasi cosa gli passi. Il nostro oggetto, oltre alla chiave nome adesso conterrà le due chiavi val1 e val2 assegnategli dal metodo SetTuple.
Spero di essere stato chiaro.
P.S. Per convenzione hanno l'iniziale maiuscola solo i costruttori! I metodi e le funzioni hanno l'iniziale minuscola ed eventualmente la maiuscola interna.