객체에서 모든 메소드를 가져 오는 방법이나 속성이 있습니까? 예를 들면 :
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
있습니까?
기술적으로 자바 스크립트 개체에는 메서드가 없습니다. 그들은 속성을 가지고 있으며, 그 중 일부는 함수 객체 일 수 있습니다. 즉, 속성을 열거 할 수있는 것처럼 객체의 메서드를 열거 할 수 있습니다. 이것은 (또는 이와 비슷한) 작동합니다.
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 );
이것은 own-properties 만 검색 하므로 프로토 타입 체인의 다른 곳에서 찾은 속성은 반환하지 않습니다. 그러나 그것은 귀하의 요청으로 보이지 않으므로이 접근 방식으로 충분하다고 가정합니다.
당신은 단지처럼보고 싶다면 열거 속성을 대신 사용할 수 있습니다 Object.keys
. 이것은 열거 할 수없는 constructor
속성을 뺀 동일한 컬렉션을 반환합니다 .
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)
es6에서만 'let'을 사용하고 대신 '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];
});
};