Вы можете использовать Object.getOwnPropertyNames()
, чтобы получить все свойства, принадлежащие объекту, перечисляемые или нет. Например:
console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]
Затем вы можете использовать filter()
, чтобы получить только методы:
console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]
В браузерах ES3 (IE 8 и ниже) свойства встроенных объектов не перечисляются. Такие объекты, как window
и document
не являются встроенными, они определены браузером и, скорее всего, могут быть перечислены по проекту.
С ECMA-262 Edition 3 :
Глобальный объект
Существует уникальный глобальный
объект (15.1), который создается ранее
управление входит в любой контекст выполнения.
Первоначально глобальный объект имеет
следующие свойства:
• Встроенный
объекты, такие как Math, String, Date,
parseInt и т. д. Они имеют атрибуты {
DontEnum} .
• Определен дополнительный хост
свойства. Это может включать в себя
свойство, значение которого является глобальным
сам объект; например, в
HTML документ объектная модель окна
Свойство глобального объекта является
сам глобальный объект.
как контроль
входит в контексты исполнения, и как
Код ECMAScript выполнен,
дополнительные свойства могут быть добавлены к
глобальный объект и начальный
свойства могут быть изменены.
Я должен отметить, что это означает, что эти объекты не являются перечисляемыми свойствами Глобального объекта. Если вы посмотрите остальную часть документа спецификации, вы увидите, что для большинства встроенных свойств и методов этих объектов установлен атрибут { DontEnum }
.
Обновление: один из пользователей SO, CMS, сообщил мне IE об ошибке { DontEnum }
.
Вместо проверки атрибута DontEnum [Microsoft] JScript пропустит любое свойство в любом объекте, где есть свойство с таким же именем в цепочке прототипов объекта, имеющего атрибут DontEnum.
Короче, будьте осторожны при именовании свойств вашего объекта. Если есть встроенное свойство или метод-прототип с таким же именем, то IE пропустит его при использовании цикла for...in
.