I manuali JavaScript canonici presentano i costruttori di oggetti senza specificare l'importanza dei parametri passati ai costruttori. In particolare non dicono quasi mai che la forma tradizionale è suscettibile di errori.
Questa è la forma tradizionale, con una sequenza di parametri:
var MY = function(one, two, three) {
this.one = one || null;
this.two = two || null;
this.three = three || null;
this.init = function() {
console.log(this.one + ' ' + this.two + ' ' + this.three);
};
return this.init();
};
Va tutto bene finché si rispetta esattamente l'ordine della sequenza. Ma cosa accade se si invertono i parametri? Accade che le proprietà dell'oggetto avranno valori errati. Possiamo rimediare utilizzando invece un oggetto per memorizzare i parametri. In questo modo l'ordine della sequenza non ha più importanza:
var MY = function(params) {
this.one = params.one || null;
this.two = params.two || null;
this.three = params.three || null;
this.init = function() {
console.log(this.one + ' ' + this.two + ' ' + this.three);
}
return this.init();
};
Esempio:
var my = new MY({
one: 'a',
three: 'c',
two: 'b'
}); // output: a b c
Nota su jQuery
In jQuery questa pratica è enormemente semplificata dal metodo $.extend()
:
var MY = function(params) {
params = $.extend({
one: null,
two: null,
three: null
}, params);
this.one = params.one;
this.two = params.two;
this.three = params.three;
this.init = function() {
console.log(this.one + ' ' + this.two + ' ' + this.three);
}
return this.init();
};
Come si può notare i parametri predefiniti qui vengono interamente gestiti tramite l'ereditarietà.