Есть ли способ или свойство получить все методы от объекта? Например:
function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}
foo.get_methods(); // returns ['a', 'b'];
ОБНОВЛЕНИЕ: есть ли такой метод в JQuery?
Спасибо.
Есть ли способ или свойство получить все методы от объекта? Например:
function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}
foo.get_methods(); // returns ['a', 'b'];
ОБНОВЛЕНИЕ: есть ли такой метод в JQuery?
Спасибо.
Ответы:
function getMethods(obj)
{
var res = [];
for(var m in obj) {
if(typeof obj[m] == "function") {
res.push(m)
}
}
return res;
}
for..inСпособ является стандартным подходом.
TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
m instanceof Function?
Помните, что технически объекты javascript не имеют методов. У них есть свойства, некоторые из которых могут быть функциональными объектами. Это означает, что вы можете перечислять методы в объекте точно так же, как вы можете перечислять свойства. Это (или что-то близкое к этому) должно работать:
var bar
for (bar in foo)
{
console.log("Foo has property " + bar);
}
Здесь есть сложности, потому что некоторые свойства объектов не перечисляются, поэтому вы не сможете найти все функции объекта.
В современных браузерах вы можете использовать Object.getOwnPropertyNamesдля получения всех свойств (как перечислимых, так и неперечисляемых) объекта. Например:
function Person ( age, name ) {
this.age = age;
this.name = name;
}
Person.prototype.greet = function () {
return "My name is " + this.name;
};
Person.prototype.age = function () {
this.age = this.age + 1;
};
// ["constructor", "greet", "age"]
Object.getOwnPropertyNames( Person.prototype );
Обратите внимание, что это извлекает только собственные свойства , поэтому не будет возвращать свойства, найденные где-либо еще в цепочке прототипов. Однако, похоже, это не ваша просьба, поэтому я предполагаю, что этого подхода достаточно.
Если вы хотите видеть только перечислимые свойства, вы можете вместо этого использовать Object.keys. Это вернет ту же коллекцию, за исключением неперечислимого constructorсвойства.
для меня единственный надежный способ получить методы последнего расширяющегося класса заключался в следующем:
function getMethodsOf(obj){
const methods = {}
Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
methods[methodName] = obj[methodName]
})
return methods
}
var funcs = []
for(var name in myObject) {
if(typeof myObject[name] === 'function') {
funcs.push(name)
}
}
Я говорю по телефону без точек с запятой :) но это общая идея.
var methods = [];
for (var key in foo.prototype) {
if (typeof foo.prototype[key] === "function") {
methods.push(key);
}
}
Вы можете просто перебрать прототип конструктора и извлечь все методы.
лучший способ:
let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)
используйте let только в es6, вместо этого используйте var
В Chrome есть keys(foo.prototype). Возврат ["a", "b"].
См. Https://developer.chrome.com/devtools/docs/commandline-api#keysobject
Последующее редактирование: если вам нужно быстро скопировать его (для более крупных объектов), сделайте это, copy(keys(foo.prototype))и он будет в буфере обмена.
Получите имена методов:
var getMethodNames = function (obj) {
return (Object.getOwnPropertyNames(obj).filter(function (key) {
return obj[key] && (typeof obj[key] === "function");
}));
};
Или получите методы:
var getMethods = function (obj) {
return (Object.getOwnPropertyNames(obj).filter(function (key) {
return obj[key] && (typeof obj[key] === "function");
})).map(function (key) {
return obj[key];
});
};