Учитывая произвольный объект JavaScript, как я могу найти его методы? - PullRequest
7 голосов
/ 15 июля 2010

Я знаю, что это возможно в python, но могу ли я получить список методов для объекта javascript?

Ответы [ 4 ]

12 голосов
/ 15 июля 2010

Вы можете перебрать свойства объекта и проверить их тип.

for(var prop in whatever) {
    if(typeof whatever[prop] == 'function') {
        //do something
    }
}
6 голосов
/ 15 июля 2010

Чтобы добавить к существующим ответам, ECMAScript 5-е изд.предоставляет способ доступа ко всем свойствам объекта (даже не перечисляемым), используя метод Object.getOwnPropertyNames.При попытке перечислить свойства собственных объектов, таких как Math, for..in

for(var property in Math) {
    console.log(property);
}

ничего не будет печатать на консоли.Однако

Object.getOwnPropertyNames(Math)

вернет:

["LN10", "PI", "E", "LOG10E", "SQRT2", "LOG2E", "SQRT1_2", "abc", "LN2", "cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]

Вы можете написать вспомогательную функцию, которая будет возвращать только методы, заданные для объекта.

function getMethods(object) {
    var properties = Object.getOwnPropertyNames(object);
    var methods = properties.filter(function(property) {
        return typeof object[property] == 'function';
    });
    return methods;
}

> getMethods(Math)
["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]

Поддержка ECMAScript 5-е изд.на данный момент довольно уныло, так как его поддерживают только ночные Chrome, IE9pre3 и Safari / Firefox.

1 голос
/ 13 февраля 2014

Эта функция получает произвольный объект и возвращает имя его прототипа, список со всеми его методами и объект с именем его свойств (и их типов).У меня нет возможности проверить его в браузере, но он работает с Nodejs (v0.10.24).

function inspectClass(obj) {    
    var objClass, className;   
    var classProto;
    var methods = [];
    var attributes = {};
    var t, a;
    try {
        if (typeof(obj) != 'function') {
            objClass = obj.constructor;
        } else {
            objClass = obj;      
        }
        className = objClass.name;
        classProto = objClass.prototype        
        Object.getOwnPropertyNames(classProto).forEach(function(m) {
            t = typeof(classProto[m]);
            if (t == 'function') {
                methods.push(m);
            } else {
                attributes[m] = t;
            }       
        });
    } catch (err) {
        className = 'undefined';
    }
    return { 'ClassName' : className,
             'Methods' : methods,
             'Attributes' : attributes
    }
}

Пример (с Nodejs):

console.log(inspectClass(new RegExp("hello")));

Вывод:

{ ClassName: 'RegExp',
  Methods: [ 'constructor', 'exec', 'test', 'toString', 'compile' ],
  Attributes: 
   { source: 'string',
     global: 'boolean',
     ignoreCase: 'boolean',
     multiline: 'boolean',
     lastIndex: 'number' } }

Следующие примеры также работают с Nodejs:

console.log(inspectClass(RegExp));
console.log(inspectClass("hello"));
console.log(inspectClass(5));
console.log(inspectClass(undefined));
console.log(inspectClass(NaN));
console.log(inspectClass(inspectClass));
0 голосов
/ 30 декабря 2016

Однолинейное решение

Object.getOwnPropertyNames(JSON).filter(function(name){ return 'function' === typeof JSON[name]; })

['parse', 'stringify']

Object.getOwnPropertyNames(String).filter(function(name){ return 'function' === typeof String[name]; })

['fromCharCode', 'fromCodePoint', 'raw']

Object.getOwnPropertyNames(Array).filter(function(name){ return 'function' === typeof Array[name]; })

['isArray', 'from', 'of']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...