È possibile utilizzare Object.getOwnPropertyNames()
per ottenere tutte le proprietà che appartengono a un oggetto, sia enumerabili che no. Per esempio:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
È quindi possibile utilizzare filter()
per ottenere solo i metodi:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
Nei browser ES3 (IE 8 e precedenti), le proprietà degli oggetti incorporati non sono enumerabili. Gli oggetti come window
e document
non sono integrati, sono definiti dal browser e molto probabilmente enumerabili in base alla progettazione.
Dall'edizione 3 di ECMA-262 :
Oggetto globale
Esiste un oggetto globale univoco (15.1), che viene creato prima che il controllo entri in qualsiasi contesto di esecuzione. Inizialmente l'oggetto globale ha le seguenti proprietà:
• Oggetti incorporati come Math, String, Date, parseInt, ecc. Questi hanno attributi {DontEnum} .
• Ulteriori proprietà definite dall'host. Ciò può includere una proprietà il cui valore è l'oggetto globale stesso; ad esempio, nel modello a oggetti del documento HTML la proprietà window dell'oggetto globale è l'oggetto globale stesso.
Quando il controllo entra in contesti di esecuzione e quando viene eseguito il codice ECMAScript, è possibile aggiungere proprietà aggiuntive all'oggetto globale e le proprietà iniziali possono essere modificate.
Devo sottolineare che questo significa che quegli oggetti non sono proprietà enumerabili dell'oggetto Global. Se guardi il resto del documento di specifica, vedrai che la maggior parte delle proprietà e dei metodi incorporati di questi oggetti hanno l' { DontEnum }
attributo impostato su di essi.
Aggiornamento: un altro utente SO, CMS, ha portato alla mia attenzione un bug IE{ DontEnum }
.
Invece di controllare l'attributo DontEnum, [Microsoft] JScript salterà qualsiasi proprietà in qualsiasi oggetto in cui è presente una proprietà con lo stesso nome nella catena di prototipi dell'oggetto che ha l'attributo DontEnum.
In breve, fai attenzione quando assegni un nome alle proprietà del tuo oggetto. Se esiste una proprietà o un metodo prototipo incorporato con lo stesso nome, IE lo salterà quando utilizza un for...in
ciclo.