Вы можете использовать, 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, к глобальному объекту могут быть добавлены дополнительные свойства, а начальные свойства могут быть изменены.
Следует отметить, что это означает, что эти объекты не являются перечисляемыми свойствами объекта Global. Если вы посмотрите остальную часть документа спецификации, вы увидите, что большинство встроенных свойств и методов этих объектов имеют { DontEnum }
атрибут, установленный для них.
Обновление: один из пользователей SO, CMS, сообщил{ DontEnum }
мне об ошибке IE .
Вместо проверки атрибута DontEnum, [Microsoft] JScript пропустит любое свойство в любом объекте, где есть свойство с таким же именем в цепочке прототипов объекта, которая имеет атрибут DontEnum.
Короче, будьте осторожны при именовании свойств вашего объекта. Если есть встроенное свойство прототипа или метод с тем же именем, то IE пропустит его при использовании for...in
цикла.
Object.getOwnPropertyNames()
, что будет возвращать даже не перечисляемые свойства и методы.Object.getOwnPropertyNames(Array.prototype)
?С ES3 это невозможно, поскольку свойства имеют внутренний
DontEnum
атрибут, который не позволяет нам перечислять эти свойства. ES5, с другой стороны, предоставляет дескрипторы свойств для управления возможностями перечисления свойств, чтобы пользовательские и собственные свойства могли использовать один и тот же интерфейс и пользоваться теми же возможностями, что включает возможность программно просматривать не перечисляемые свойства.getOwnPropertyNames
Функция может быть использована для перечисления над всеми свойствами переданных в объекте, в том числе и те , которые не являются перечислимы. Затемtypeof
можно применить простую проверку, чтобы отфильтровать не-функции. К сожалению, Chrome - единственный браузер, на котором он работает в настоящее время.логи
["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]
в произвольном порядке.источник
Таким образом, вы получите все методы, которые вы можете вызывать
obj
. Это включает методы, которые он «наследует» от своего прототипа (какgetMethods()
в java). Если вы хотите видеть только те методы, которые определены непосредственно,obj
вы можете проверить с помощьюhasOwnProperty
:источник
document
илиwindow
я получаю больше удачи. Честно говоря, это немного неожиданно, я не знаю, почему это не работает для математики и т. Д.document
иwindow
являются объектами с перечисляемыми свойствами, предоставляемыми браузером, они не являются частью среды выполнения сценариев. Нативные объекты есть и, очевидно, свойства не перечисляются.Поддержка большинства современных браузеров
console.dir(obj)
, которая возвращает все свойства объекта, которые он унаследовал через конструктор. См. Документацию Mozilla для получения дополнительной информации и текущей поддержки браузера.источник
Другие ответы здесь работают для чего-то вроде Math, который является статическим объектом. Но они не работают для экземпляра объекта, такого как дата. Я нашел следующее, чтобы работать:
https://jsfiddle.net/3xrsead0/
Это не сработает для чего-то вроде оригинального вопроса (Math), поэтому выбирайте свое решение исходя из своих потребностей. Я публикую это здесь, потому что Google отправил меня на этот вопрос, но я хотел знать, как это сделать для экземпляров объектов.
источник
Короткий ответ: ты не можешь, потому что (
Math
иDate
я уверен, что есть и другие) не являются нормальными объектами. Чтобы увидеть это, создайте простой тестовый скрипт:Вы видите, что он представлен как объект точно так же, как документ в целом, но когда вы на самом деле пытаетесь увидеть этот объект, вы видите, что это нативный код и что-то, что не перечислено для перечисления таким же образом.
источник
Math
имеет статический метод, где вы можете вызывать напрямую, как вMath.abs()
то время какDate
имеет статический метод как,Date.now()
а также метод экземпляра, где вам нужно сначала создать новый экземплярvar time = new Date()
для вызоваtime.getHours()
.Конечно, вам нужно будет отфильтровать полученные ключи для статического метода, чтобы получить реальные имена методов, потому что вы также можете получить
length, name
те, которые не являются функцией в списке.Но как, если мы хотим получить все доступные методы из класса, которые расширяют другой класс?
Конечно, вам нужно будет сканировать корень прототипа, как при использовании
__proto__
. Для экономии вашего времени вы можете использовать скрипт ниже, чтобы получить статический метод и глубокий экземпляр метода.Если вы хотите получить методы из созданного экземпляра, не забудьте передать
constructor
его.источник
Я полагаю, что существует простая историческая причина, по которой вы не можете перечислять методы встроенных объектов, таких как, например, Array. Вот почему:
Методы - это свойства объекта-прототипа, скажем, Object.prototype. Это означает, что все экземпляры Object будут наследовать эти методы. Вот почему вы можете использовать эти методы на любом объекте. Скажем .toString (), например.
Так что методы IF были перечислимы, и я бы повторил, скажем, {a: 123} с помощью: "for (введите {a: 123}) {...}" что произойдет? Сколько раз этот цикл будет выполнен?
В нашем примере это будет повторено один раз для единственного ключа «а». НО ТАКЖЕ один раз для каждого перечисляемого свойства Object.prototype. Таким образом, если бы методы были перечисляемыми (по умолчанию), то любой цикл по любому объекту также должен был бы пройти по всем его унаследованным методам.
источник
Object.getOwnPropertyNames(Array.prototype)
например,