Как отобразить все методы объекта?

Я хочу знать, как перечислить все методы, доступные для объекта как, например:

 alert(show_all_methods(Math));

Это должно распечатать:

abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, …
232
задан Sebastian Simon 30 August 2017 в 21:26
поделиться

5 ответов

Вы можете использовать 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). объект (15.1), который создается до того, как управление входит в любой контекст выполнения. Первоначально глобальный объект имеет следующие свойства:

- Встроенные объекты, такие как Math, String, Date, parseInt и т.д. - Они имеют атрибуты { DontEnum }
- Дополнительные определенные хостом свойства. Они могут включать свойство, значением которого является глобальный объект; например, в объектной модели документа HTML свойство window свойство глобального объекта является сам глобальный объект.

По мере того как управление входит в контексты выполнения, и по мере код ECMAScript выполняется, дополнительные свойства могут быть добавлены к глобальный объект, а исходные свойства могут быть изменены.

Я должен отметить, что это означает, что эти объекты не являются перечислимыми свойствами объекта Global. Если вы просмотрите остальную часть документа спецификации, вы увидите, что большинство встроенных свойств и методов этих объектов имеют атрибут { DontEnum }, установленный на них.


Обновление: один из пользователей SO, CMS, обратил мое внимание на ошибку в IE относительно { DontEnum } атрибута.

Вместо проверки атрибута DontEnum, [Microsoft] JScript будет пропускать любое свойство любого объекта, если в цепочке прототипов объекта есть одноименное свойство с атрибутом DontEnum.

Короче говоря, будьте осторожны при именовании свойств объектов. Если есть встроенное свойство прототипа или метод с таким же именем, IE пропустит его при использовании цикла for...in.

278
ответ дан 23 November 2019 в 03:34
поделиться
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(","));
57
ответ дан 23 November 2019 в 03:34
поделиться

Короткий ответ: нельзя, потому что Math и Date (не помню, наверняка есть и другие) не являются обычными объектами. Чтобы увидеть это, создайте простой тестовый скрипт:

<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>

Вы видите, что он представляется как объект так же, как это делает документ в целом, но когда вы на самом деле пытаетесь заглянуть в этот объект, вы видите, что это родной код и что-то, что не раскрывается таким же образом для перечисления.

3
ответ дан 23 November 2019 в 03:34
поделиться

Номера от 987-65-4320 до 987-65-4329 зарезервированы для использования в рекламе.

-121--919952-

Вот как мы подходим к проблеме:

Все вызовы с уровня UI/codebhind на другие уровни используют try-catch, где мы всегда ловим пользовательское исключение. Все действия, выполняемые базовыми слоями, имеют собственный метод try-catch, который регистрирует, переносит и выбрасывает пользовательское исключение. Затем пользовательский интерфейс может полагаться на это и искать обработанные исключения с понятными сообщениями об ошибках.

Codebehind:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    //do something when a button is clicked...
    try
    {
        MyBL.TakeAction()
    }
    catch(MyApplicationCustomException ex)
    {
        //display something to the user, etc.
        ltlErrorPane.Text = ex.Message;

        //or redirect if desired
        if(ex.ErrorType == MyCustomErrorsType.Transactional)
        {
            Response.Redirect("~/Errors/Transaction.aspx");
        }
    }
}

BL:

На бизнес-уровне любые операции, которые могут завершиться неудачей, используют try-catch, который регистрирует и переносит проблему перед ее передачей в интерфейс пользователя.

public class MyBL
{
    public static void TakeAction()
    {
        try
        {
            //do something
        }
        catch(SpecificDotNetException ex)
        {
            //log, wrap and throw
            MyExceptionManagement.LogException(ex)
            throw new MyApplicationCustomException(ex, "Some friendly error message", MyCustomErrorsType.Transactional);
        }
        finally
        {
            //clean up...
        }
    }
}

Обработчик исключений:

фактический обработчик исключений имеет несколько способов регистрации, включая журнал событий, журнал файлов и, наконец, электронную почту, если все остальные ошибки не удается выполнить. Мы выбираем простой возврат false, если регистратор не может выполнить какие-либо из ожидаемых действий. ИМО, однако, это личный выбор. Мы считаем, что вероятность отказа 3 методов последовательно (сбой журнала событий, попытка файла журнала, сбой, попытка электронной почты, сбой) очень маловероятна. В этом случае мы решили разрешить продолжение работы приложения. Другой вариант - разрешить приложению полностью выйти из строя.

public static class MyExceptionManagement
{
    public static bool LogException(Exception ex)
    {
        try
        {
            //try logging to a log source by priority, 
            //if it fails with all sources, return false as a last resort
            //we choose not to let logging issues interfere with user experience

            //if logging worked
            return true;
        }
        catch(Exception ex)
        {
            //in most cases, using try-catch as a true-false is bad practice
            //but when logging an exception causes an exception itself, we do
            //use this as a well-considered choice.
            return false;
        }
    }
}

Наконец, в качестве отказоустойчивого решения мы реализуем глобальный обработчик событий Application _ Error Global.asax ). Это последнее средство для случаев, когда мы не пытались что-то правильно поймать. Мы обычно регистрируемся и перенаправляем на дружественную страницу ошибок. Однако, если вышеописанная пользовательская обработка ошибок выполнена успешно, в глобальный обработчик будет внесено очень мало ошибок.

Надеюсь, это немного поможет. Это одно из возможных решений. Он очень хорошо работал для нас в течение нескольких лет в некоторых более крупных приложениях..

-121--2275630-

Большинство современных браузеров поддерживают console.dir (obj) , что возвращает все свойства объекта, унаследованные им через конструктор. Дополнительную информацию и текущую поддержку браузера см. в документации Mozilla .

console.dir(Math)
=> MathConstructor
E: 2.718281828459045
LN2: 0.6931471805599453
...
tan: function tan() { [native code] }
__proto__: Object
27
ответ дан 23 November 2019 в 03:34
поделиться

Это невозможно с ES3, поскольку свойства имеют внутренний атрибут DontEnum , который не позволяет нам перечислить эти свойства. ES5, с другой стороны, предоставляет дескрипторы свойств для управления возможностями перечисления свойств, поэтому определяемые пользователем и собственные свойства могут использовать один и тот же интерфейс и пользоваться одними и теми же возможностями, включая возможность программно просматривать неперечислимые свойства.

Функция getOwnPropertyNames может использоваться для перечисления всех свойств переданного объекта, в том числе неперечислимых. Затем можно использовать простую проверку типа , чтобы отфильтровать нефункции. К сожалению, Chrome - единственный браузер, в котором он сейчас работает.

​function getAllMethods(object) {
    return Object.getOwnPropertyNames(object).filter(function(property) {
        return typeof object[property] == 'function';
    });
}

console.log(getAllMethods(Math));

журналы [«cos», «pow», «log», «tan», «sqrt», «ceil», «asin», «abs», «max», «exp», «atan2» "," random "," round "," floor "," acos "," atan "," min "," sin "] без определенного порядка.

70
ответ дан 23 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: