객체의 메소드를 얻는 방법?


90

객체에서 모든 메소드를 가져 오는 방법이나 속성이 있습니까? 예를 들면 :

function foo() {}
foo.prototype.a = function() {}
foo.prototype.b = function() {}

foo.get_methods(); // returns ['a', 'b'];

업데이트 : Jquery에 이와 같은 방법이 있습니까?

감사합니다.


답변:


71
function getMethods(obj)
{
    var res = [];
    for(var m in obj) {
        if(typeof obj[m] == "function") {
            res.push(m)
        }
    }
    return res;
}

2
for..in방법은 표준 방법입니다.
Makram Saleh 2011

1
수정 해 주셔서 감사합니다, Chris! 나는 ... TypeErrors처럼 생각TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
줄리안 F. Weinert에게

이제 코드가 대괄호로 고정됩니다. 불편을 드려 죄송합니다.
Makram Saleh 2013 년

편의를 위해 배열 정렬을 추가했습니다.
SomeGuyOnAComputer 2015-08-07

조건을 평가하면 차이가 m instanceof Function있습니까?
Jose

46

기술적으로 자바 스크립트 개체에는 메서드가 없습니다. 그들은 속성을 가지고 있으며, 그 중 일부는 함수 객체 일 수 있습니다. 즉, 속성을 열거 할 수있는 것처럼 객체의 메서드를 열거 할 수 있습니다. 이것은 (또는 이와 비슷한) 작동합니다.

var bar
for (bar in foo)
{
    console.log("Foo has property " + bar);
}

개체의 일부 속성은 열거 할 수 없으므로 개체의 모든 기능 을 찾을 수 없기 때문에 복잡 합니다.


2
아마도 그는 console.log에 대해 이야기하고 있었을 것입니다. 감사합니다.
thom

2
예, 매일 JS를하지 않기 때문에 100 % 관심이 없습니다. 하지만 언어를 이해합니다 ..
ReinstateMonica Larry Osterman 2011

27

를 사용 console.dir(object)하여 해당 개체 속성을 콘솔에 쓸 수 있습니다 .


18

최신 브라우저에서는 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속성을 뺀 동일한 컬렉션을 반환합니다 .


6

브라우저의 개발자 도구 (F12)를 사용하여 객체의 프로토 타입 체인에서 메서드를 검사 할 수 있습니다.

  console.log(yourJSObject);

또는 더 직접

  console.dir(yourJSObject.__proto__);

4

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

4

저에게있어 최종 확장 클래스의 메서드를 얻는 유일한 방법은 다음과 같이하는 것입니다.

function getMethodsOf(obj){
  const methods = {}
  Object.getOwnPropertyNames( Object.getPrototypeOf(obj) ).forEach(methodName => {
    methods[methodName] = obj[methodName]
  })
  return methods
}

2
var funcs = []
for(var name in myObject) {
    if(typeof myObject[name] === 'function') {
        funcs.push(name)
    }
}

세미콜론이없는 전화를 사용하고 있습니다. :) 그것이 일반적인 생각입니다.


4
세미콜론이 없지만 질문에 답할 수있는 전화기는 무엇입니까? LOL
Hogan

나는 새 전화가 당신의 이름 콜론 이라고 생각합니다 !
Redwolf 프로그램 2018-04-15

1
var methods = [];
for (var key in foo.prototype) {
    if (typeof foo.prototype[key] === "function") {
         methods.push(key);
    }
}

생성자의 프로토 타입을 간단히 반복하고 모든 메서드를 추출 할 수 있습니다.


이것은 객체에 직접 연결된 메서드를 고려하지 않습니다
Matt Greer 2011

@MattGreer 그의 예제는 생성자에 대한 메서드를 호출했습니다. 그가 생성 자나 객체의 메소드를 원하는지 여부는 다른 문제입니다.
Raynos 2011

1

가장 좋은 방법은 다음과 같습니다.

let methods = Object.getOwnPropertyNames(yourobject);
console.log(methods)

es6에서만 'let'을 사용하고 대신 'var'를 사용하십시오.


1
속성 목록을 반환합니다.
Ali Ben Messaoud

Ali가 언급했듯이 이것은 클래스 (메소드)에서 getter / setter로 정의 된 함수를 제외합니다.
Shaun


0

메서드 이름을 가져옵니다.

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];
    });
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.