PHP dispone di svariate funzionalità per esaminare introspettivamente classi e oggetti. JavaScript, purtroppo, non dispone di nulla di simile. Possiamo colmare questa lacuna creando una funzione di utility che analizzi gli oggetti passati come argomento.
La funzione è la seguente:
var printObject = function(obj) {
if (typeof obj !== 'object') {
console.log('Not an object');
return;
}
var output = '';
for (var i in obj) {
var propName = i;
var propValue = obj[i];
var type = (typeof propValue);
switch (type) {
case 'function':
output += ' [method] ' + propName + '\n\n';
break;
case 'object':
output += '\t[object] ' + propName + ' ' + printObject(propValue) + '\n\n';
break;
default:
output += ' [property] ' + propName + ' ' + propValue + '\n\n';
break;
}
}
return output;
};
Questa funzione analizza i membri di un oggetto e li suddivide in tre categorie, ossia metodi (funzioni), proprietà e oggetti. Nel caso degli oggetti membri di un oggetto genitore, la funzione chiama ricorsivamente se stessa ed effettua la stessa analisi su questo tipo di membri.
Ecco due esempi:
var test = {
property: 'Test',
method: function() {
return;
},
o: {
a: 1,
b: function() {
return;
}
}
};
var lib = function() {
this.test = 'OK';
this.run = function() {
console.log(this.test);
};
this.sub = new
function() {
this.foo = 'Foo';
}();
};
var my = new lib();
alert(printObject(test));
alert(printObject(my));
E gli array?
L'implementazione di questa funzione è basica e quindi non tiene in considerazione il tipo di dati array. Un array in JavaScript è un oggetto e si può desumere il tipo di dati in questione esaminando la proprietà constructor
dell'oggetto prototype
.
Potete visionare l'esempio finale in questa pagina.