Czy istnieje metoda lub właściwość pobierania wszystkich metod z obiektu? Na przykład:
function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}
foo.get_methods(); // returns ['a', 'b'];
AKTUALIZACJA: Czy w Jquery jest jakaś taka metoda?
Dziękuję Ci.
Odpowiedzi:
function getMethods(obj) { var res = []; for(var m in obj) { if(typeof obj[m] == "function") { res.push(m) } } return res; }
źródło
for..in
Sposób jest standardowym podejściem.TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
m instanceof Function
?Pamiętaj, że technicznie obiekty javascript nie mają metod. Mają właściwości, z których niektóre mogą być obiektami funkcji. Oznacza to, że możesz wyliczyć metody w obiekcie, tak jak możesz wyliczyć właściwości. To (lub coś zbliżonego) powinno działać:
var bar for (bar in foo) { console.log("Foo has property " + bar); }
Są z tym komplikacje, ponieważ niektórych właściwości obiektów nie można wyliczyć, więc nie będzie można znaleźć wszystkich funkcji w obiekcie.
źródło
Możesz użyć
console.dir(object)
do zapisania tych właściwości obiektów w konsoli.źródło
W nowoczesnych przeglądarkach można użyć
Object.getOwnPropertyNames
do pobrania wszystkich właściwości (zarówno wyliczalnych, jak i niewliczalnych) obiektu. Na przykład: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 );
Zauważ, że to pobiera tylko własne właściwości , więc nie zwróci właściwości znalezionych gdzie indziej w łańcuchu prototypów. To jednak nie wydaje się być Twoją prośbą, więc przyjmuję, że takie podejście jest wystarczające.
Jeśli chcesz zobaczyć tylko wyliczalne właściwości, możesz zamiast tego użyć
Object.keys
. To zwróci tę samą kolekcję, pomniejszoną o niewliczalnąconstructor
właściwość.źródło
Metody można sprawdzić w łańcuchu prototypów obiektu za pomocą narzędzi programistycznych przeglądarki (F12):
console.log(yourJSObject);
lub bardziej bezpośrednio
console.dir(yourJSObject.__proto__);
źródło
W ES6:
let myObj = {myFn : function() {}, tamato: true}; let allKeys = Object.keys(myObj); let fnKeys = allKeys.filter(key => typeof myObj[key] == 'function'); console.log(fnKeys); // output: ["myFn"]
źródło
dla mnie jedynym niezawodnym sposobem uzyskania metod ostatniej klasy rozszerzającej było zrobienie tego w następujący sposób:
function getMethodsOf(obj){ const methods = {} Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => { methods[methodName] = obj[methodName] }) return methods }
źródło
var funcs = [] for(var name in myObject) { if(typeof myObject[name] === 'function') { funcs.push(name) } }
Rozmawiam przez telefon bez średników :) ale taki jest ogólny pomysł.
źródło
var methods = []; for (var key in foo.prototype) { if (typeof foo.prototype[key] === "function") { methods.push(key); } }
Możesz po prostu zapętlić prototyp konstruktora i wyodrębnić wszystkie metody.
źródło
najlepszy sposób to:
let methods = Object.getOwnPropertyNames(yourobject); console.log(methods)
użyj „let” tylko w es6, zamiast tego użyj „var”
źródło
W Chrome jest
keys(foo.prototype)
. Zwroty["a", "b"]
.Zobacz: https://developer.chrome.com/devtools/docs/commandline-api#keysobject
Późniejsza edycja: Jeśli chcesz to szybko skopiować (dla większych obiektów), zrób to,
copy(keys(foo.prototype))
a będziesz mieć to w schowku.źródło
Uzyskaj nazwy metod:
var getMethodNames = function (obj) { return (Object.getOwnPropertyNames(obj).filter(function (key) { return obj[key] && (typeof obj[key] === "function"); })); };
Lub pobierz metody:
var getMethods = function (obj) { return (Object.getOwnPropertyNames(obj).filter(function (key) { return obj[key] && (typeof obj[key] === "function"); })).map(function (key) { return obj[key]; }); };
źródło