Làm thế nào để lấy các phương thức của một đối tượng?


89

Có phương thức hoặc phương thức thích hợp nào để lấy tất cả các phương thức từ một đối tượng không? Ví dụ:

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

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

CẬP NHẬT: Có phương thức nào như vậy trong Jquery không?

Cảm ơn bạn.


Câu trả lời:


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

2
Các for..incách là phương pháp tiêu chuẩn.
Makram Saleh

1
Cảm ơn bạn đã chỉnh sửa, Chris! Tôi nghĩ bạn thích TypeErrors…TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert.

Mã hiện đã được cố định với dấu ngoặc vuông. Xin lỗi vì sự bất tiện.
Makram Saleh vào

Đã thêm sắp xếp mảng để thuận tiện.
SomeGuyOnAComputer

có sự khác biệt nếu bạn đánh giá điều kiện m instanceof Function?
Jose

46

Hãy nhớ rằng các đối tượng javascript về mặt kỹ thuật không có phương thức. Chúng có các thuộc tính, một số có thể là các đối tượng hàm. Điều đó có nghĩa là bạn có thể liệt kê các phương thức trong một đối tượng giống như bạn có thể liệt kê các thuộc tính. Cái này (hoặc cái gì đó gần với cái này) sẽ hoạt động:

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

Có một số phức tạp đối với điều này vì một số thuộc tính của các đối tượng không thể liệt kê được, vì vậy bạn sẽ không thể tìm thấy mọi hàm trên đối tượng.


2
có thể anh ấy đang nói về console.log. Cảm ơn bạn.
thom

2
Vâng, tôi không làm JS mỗi ngày nên tôi không hoàn toàn tập trung vào nó. Nhưng tôi hiểu ngôn ngữ ..
ReinstateMonica Larry Osterman,

27

Bạn có thể sử dụng console.dir(object)để ghi các thuộc tính đối tượng đó vào bảng điều khiển.


17

Trong các trình duyệt hiện đại, bạn có thể sử dụng Object.getOwnPropertyNamesđể lấy tất cả các thuộc tính (cả có thể liệt kê và không thể liệt kê) trên một đối tượng. Ví dụ:

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 );

Lưu ý rằng điều này chỉ lấy các thuộc tính riêng , vì vậy nó sẽ không trả về các thuộc tính được tìm thấy ở nơi khác trên chuỗi nguyên mẫu. Tuy nhiên, điều đó dường như không phải là yêu cầu của bạn vì vậy tôi sẽ cho rằng cách tiếp cận này là đủ.

Nếu bạn chỉ muốn xem các thuộc tính có thể liệt kê , bạn có thể sử dụng thay thế Object.keys. Điều này sẽ trả về cùng một tập hợp, trừ đi thuộc tính không liệt kê được constructor.


6

Các phương pháp có thể được kiểm tra trong chuỗi nguyên mẫu của đối tượng bằng cách sử dụng các công cụ dành cho nhà phát triển của trình duyệt (F12):

  console.log(yourJSObject);

hoặc trực tiếp hơn

  console.dir(yourJSObject.__proto__);

4

Trong 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

đối với tôi, cách đáng tin cậy duy nhất để lấy các phương thức của lớp mở rộng cuối cùng là làm như sau:

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)
    }
}

Tôi đang sử dụng điện thoại không có dấu chấm phẩy :) nhưng đó là ý kiến ​​chung.


4
Điện thoại nào không có dấu chấm phẩy nhưng cho phép bạn trả lời câu hỏi? LOL
huyền thoại

Tôi nghĩ rằng một chiếc điện thoại mới là ruột tên của bạn!
Chương trình Người sói

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

Bạn có thể chỉ cần lặp qua nguyên mẫu của một hàm tạo và trích xuất tất cả các phương thức.


Điều này sẽ không chiếm phương pháp gắn liền trực tiếp đến đối tượng
Matt Greer

@MattGreer ví dụ của anh ấy được gọi là một phương thức trên một phương thức khởi tạo. Cho dù anh ta muốn các phương thức từ một phương thức khởi tạo hay một đối tượng là một vấn đề khác.
Raynos

1

cách tốt nhất là:

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

chỉ sử dụng 'let' trong es6, sử dụng 'var' để thay thế


1
Nó trả về một danh sách các thuộc tính.
Ali Ben Messaoud

Như Ali đã ám chỉ, điều này loại trừ các hàm được định nghĩa là getters / setters trên một lớp (phương thức).
Shaun


0

Nhận các tên phương pháp:

var getMethodNames = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    }));
};

Hoặc, Nhận các phương pháp:

var getMethods     = function (obj) {
    return (Object.getOwnPropertyNames(obj).filter(function (key) {
        return obj[key] && (typeof obj[key] === "function");
    })).map(function (key) {
        return obj[key];
    });
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.