Я хочу знать, как перечислить все методы, доступные для объекта, например:
alert(show_all_methods(Math));
Это должно вывести:
abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
Вы можете использовать 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 и ниже), свойства встроенных объектов не'т перечисли. Такие объекты, как "окно" и "документ" вовсе'т встроенные, они'вновь определен в браузере и, скорее всего, перечисляемую по дизайну.
глобальный объект есть уникальный глобальный объекта (15.1), которая создается прежде контроль входит в любой контекст выполнения. первоначально глобальный объект имеет следующие свойства:
• встроенный объекты, такие как математические, строковые, даты, parseInt и т. д. Эти атрибуты { атрибутами "dontenum"}. • дополнительное определенными Свойства. Это может включать в себя имущества, стоимость которого глобальная сам объект; например, в По объектной модели документа HTML в окно свойство глобального объекта-это сам глобальный объект.
В качестве контроля входит в контексты выполнения, и как код ECMAScript выполняется, дополнительные свойства могут быть добавлены к глобального объекта и начальной свойства могут быть изменены.
Я должен отметить, что это означает, что эти объекты не'т перечислимыми свойствами глобального объекта. Если вы посмотрите на остальные спецификацию документа, вы увидите большинство встроенных свойств и методов этих объектов у { атрибутами "dontenum"}
набор атрибутов на них.
Обновление: парень, так что пользователь, КМВ, принес т. е. ошибка в отношении { атрибутами "dontenum"}
мое внимание.
вместо того, чтобы проверить атрибут атрибутами "dontenum", [Майкрософт] JScript будет пропускать любую недвижимость в любом объекте, где есть одноименного свойства объекта'цепь прототип, который обладает атрибутами "dontenum" атрибут.
Короче, будьте осторожны при вводе имени свойства объекта. Если есть встроенное свойство прототипа или метод с тем же именем, т. е. тогда будет пропускать его при использовании Для...в петлю.
Это's не возможный с ES3 как свойства имеют внутреннюю атрибутами "dontenum"
атрибут, который мешает нам перечислить эти свойства. В ES5, с другой стороны, обеспечивает дескрипторы свойств для контроля возможности перечисления свойств, поэтому пользовательские и системные свойства можно использовать тот же интерфейс и пользоваться теми же возможностями, включая возможность видеть неперечислимый свойства программно.
Функция getOwnPropertyNames
может использоваться, чтобы перечислить все свойства переданному в объекте, в том числе те, которые неперечислимый. Затем простым оператора typeof
проверка может использоваться, чтобы отфильтровать номера-функции. К сожалению, хром-единственный браузер, который работает на данный момент.
function getAllMethods(object) {
return Object.getOwnPropertyNames(object).filter(function(property) {
return typeof object[property] == 'function';
});
}
console.log(getAllMethods(Math));
журналы `[и"потому что", то "военнопленных" В, С "войти" В, С "Тан" В, С "корень и", "с потолка" В, С "как-то", то "АБС" В, С "МАКС" В, С "годен" и "Ну инструмент atan2-то", то "случайно" и, на "вокруг", "пол" В, С "Экос" и "Ну Атан" В, С "мин" и, "от греха"] в частности, нет порядка.
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function") {
methods.push(m);
}
}
alert(methods.join(","));
Таким образом, вы получите все методы, которые можно вызвать на объект obj. Это включает в себя методы, которые ее "наследует" от своего прототипа (как getMethods () в Java). Если вы хотите увидеть только те методы, определенные непосредственно на объект obj
вы можете проверить с метод hasOwnProperty
:
var methods = [];
for (var m in obj) {
if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
methods.push(m);
}
}
alert(methods.join(","));
Самая современная поддержка браузера консоли.реж(объект)`, который возвращает все свойства объекта, который он унаследовал через его конструктор. Увидеть Мозилла'ы документация для получения дополнительной информации и текущей поддержки браузера.
Яш консоль.реж(математика) => MathConstructor Е: 2.718281828459045 LN2 на: 0.6931471805599453 ... Тан: Тан функция() { [машинный код] } свойство __proto__: объект
Короткий ответ: вы можете't, потому что математика
и дата
(с верхней части моей головы, Я'уверен, что есть другие)'т нормальные объекты. Чтобы убедиться в этом, создать простой тестовый скрипт:
<html>
<body>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
alert("Math: " + Math);
alert("Math: " + Math.sqrt);
alert("Date: " + Date);
alert("Array: " + Array);
alert("jQuery: " + jQuery);
alert("Document: " + document);
alert("Document: " + document.ready);
});
</script>
</body>
</html>
Вы видите, он представляет как объект таким же образом, документ в целом, но когда вы на самом деле попробовать и посмотреть на этот объект, вы видите, что это'ы машинный код и что-то не выставил одинаково для перечисления.
Других ответов здесь работают Для что-то вроде математики, которая является статическим объектом. Но они не't работа для примеру объект, такой как дата. Я нашел следующую работу:
function getMethods(o) {
return Object.getOwnPropertyNames(Object.getPrototypeOf(o))
.filter(m => 'function' === typeof o[m])
}
//example: getMethods(new Date()): [ 'getFullYear', 'setMonth', ... ]
Это выиграл'т работа на что-то вроде исходный вопрос (математика), поэтому подобрать решение исходя из ваших потребностей. Я'м отправляю это здесь, потому что Google прислал мне на этот вопрос, но я желал бы знать, как это сделать для экземпляров объектов.
Я верю, что там'ы простой исторической причиной, почему вы можете'т перечислять над методами встроенного массива, как например объекты. Здесь's почему:
Методы свойства прототипа-объекта, сказать, объект.прототип. Это означает, что все объекты-экземпляры будут наследовать эти методы. Что'ы почему вы можете использовать эти методы на любом объекте. Сказать .toString() для экземпляра.
Так что, если методы были перечисли, и я бы перебрать скажем {а:123} с: "и для (ключ В {а:123}) {...}" Что бы произошло? Сколько раз это цикл будет выполняться?
Было бы один раз повторяются за один ключ 'Это' в нашем примере. НО И один раз для каждого свойства enumerable объекта.прототип. Так что если методы перечисли (по умолчанию), то любую петлю над любым объектом будет петля за все свои унаследованные методы, а также.