วิธีการรับวัตถุ?


90

มีวิธีการหรือวิธีการที่เหมาะสมในการรับวิธีการทั้งหมดจากวัตถุหรือไม่? ตัวอย่างเช่น:

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

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

UPDATE: มีวิธีการเช่นนั้นใน Jquery หรือไม่?

ขอขอบคุณ.


ดูเพิ่มเติม: stackoverflow.com/questions/3252406/…
sligocki

คำตอบ:


72
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

1
ขอบคุณสำหรับการแก้ไขคริส! ฉันคิดว่าคุณชอบ TypeErrors …TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
Julian F. Weinert

ตอนนี้รหัสได้รับการแก้ไขด้วยวงเล็บเหลี่ยม ขออภัยในความไม่สะดวก.
Makram Saleh

เพิ่มการจัดเรียงอาร์เรย์เพื่อความสะดวก
SomeGuyOnAComputer

จะมีความแตกต่างกันถ้าคุณประเมินสภาพm instanceof Function?
Jose

46

โปรดจำไว้ว่าในทางเทคนิควัตถุจาวาสคริปต์ไม่มีเมธอด พวกมันมีคุณสมบัติซึ่งบางอย่างอาจเป็นวัตถุฟังก์ชัน นั่นหมายความว่าคุณสามารถแจกแจงวิธีการในวัตถุได้เช่นเดียวกับที่คุณสามารถแจกแจงคุณสมบัติได้ สิ่งนี้ (หรือสิ่งที่ใกล้เคียงกับสิ่งนี้) ควรใช้งานได้:

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

มีความซับซ้อนเกิดขึ้นเนื่องจากคุณสมบัติบางอย่างของวัตถุไม่สามารถระบุได้ดังนั้นคุณจะไม่สามารถค้นหาทุกฟังก์ชันบนวัตถุได้


2
บางทีเขาอาจกำลังพูดถึง console.log ขอขอบคุณ.

2
ใช่ฉันไม่ได้ทำ JS ทุกวันดังนั้นฉันจึงไม่ 100% กับมัน แต่ฉันเข้าใจภาษา ..
ReinstateMonica Larry Osterman

27

คุณสามารถใช้console.dir(object)เพื่อเขียนคุณสมบัติวัตถุนั้นลงในคอนโซล


19

ในเบราว์เซอร์สมัยใหม่คุณสามารถใช้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ได้


6

สามารถตรวจสอบวิธีการในห่วงโซ่ต้นแบบของวัตถุโดยใช้เครื่องมือสำหรับนักพัฒนาของเบราว์เซอร์ (F12):

  console.log(yourJSObject);

หรือมากกว่าโดยตรง

  console.dir(yourJSObject.__proto__);


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

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

คุณสามารถวนซ้ำต้นแบบของตัวสร้างและแยกวิธีการทั้งหมด


สิ่งนี้จะไม่อธิบายถึงวิธีการที่แนบมากับวัตถุโดยตรง
Matt Greer

@MattGreer ตัวอย่างของเขาเรียกว่าเมธอดบนคอนสตรัคเตอร์ ไม่ว่าเขาจะต้องการวิธีการจากผู้สร้างหรือวัตถุก็เป็นคนละเรื่องกัน
Raynos

1

วิธีที่ดีที่สุดคือ:

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

ใช้ 'let' เฉพาะใน es6 ใช้ 'var' แทน


1
ส่งคืนรายการของแอตทริบิวต์
Ali Ben Messaoud

ตามที่ Ali กล่าวถึงสิ่งนี้จะไม่รวมฟังก์ชันที่กำหนดให้เป็น getters / setters บนคลาส (method)
Shaun

0

ใน Chrome คือkeys(foo.prototype). ["a", "b"]ผลตอบแทน

ดู: https://developer.chrome.com/devtools/docs/commandline-api#keysobjectป้อนคำอธิบายภาพที่นี่

แก้ไขภายหลัง: หากคุณต้องการคัดลอกอย่างรวดเร็ว (สำหรับวัตถุที่ใหญ่กว่า) ให้ทำcopy(keys(foo.prototype))และคุณจะมีในคลิปบอร์ด


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.