किसी वस्तु के तरीके कैसे प्राप्त करें?


90

किसी वस्तु से सभी विधियाँ प्राप्त करने की कोई विधि या विधि है? उदाहरण के लिए:

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

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

अद्यतन: वहाँ किसी भी विधि की तरह है कि jquery?

धन्यवाद।


इन्हें भी देखें: stackoverflow.com/questions/3252406/…
sligocki

जवाबों:


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

2
for..inजिस तरह से मानक दृष्टिकोण है।
मकरम सालेह

1
आपके संपादन के लिए धन्यवाद, क्रिस! मुझे लगता है कि आप टाइपरियर्स पसंद करते हैं ...TypeError: '[object Object]' is not a function (evaluating 'obj(m)')
जूलियन एफ। वेनर्ट

अब कोड कोष्ठक के साथ तय किया गया है। असुविधा के लिए खेद है।
मकरम सालेह

सुविधा के लिए सरणी छँटाई गयी।
SomeGuyOnAComputer

यदि आप स्थिति का मूल्यांकन करते हैं तो क्या कोई अंतर है m instanceof Function?
जोस

46

याद रखें कि तकनीकी रूप से जावास्क्रिप्ट ऑब्जेक्ट में विधियाँ नहीं होती हैं। उनके पास गुण हैं, जिनमें से कुछ फ़ंक्शन ऑब्जेक्ट हो सकते हैं। इसका मतलब है कि आप किसी ऑब्जेक्ट में तरीकों की गणना कर सकते हैं जैसे आप गुणों की गणना कर सकते हैं। यह (या इसके करीब कुछ) काम करना चाहिए:

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

इसके कारण जटिलताएं हैं क्योंकि वस्तुओं के कुछ गुण उल्लेखनीय नहीं हैं, इसलिए आप ऑब्जेक्ट पर प्रत्येक फ़ंक्शन को खोजने में सक्षम नहीं होंगे ।


2
शायद वह कंसोल के बारे में बात कर रहा था। धन्यवाद।
थॉम

2
हाँ, मैं हर दिन JS नहीं करता हूँ इसलिए मैं इस पर 100% नहीं हूँ। लेकिन मुझे भाषा समझ में नहीं आती है ..
ReinstateMonica Larry Osterman

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

ध्यान दें कि यह केवल स्वयं के गुणों को पुनः प्राप्त करता है , इसलिए यह प्रोटोटाइप श्रृंखला पर कहीं और पाए गए गुणों को वापस नहीं करेगा। हालांकि, यह आपके अनुरोध के रूप में प्रकट नहीं होता है, इसलिए मुझे लगता है कि यह दृष्टिकोण पर्याप्त है।

यदि आप केवल दमकते हुए गुण देखना चाहते हैं, तो आप इसके बजाय उपयोग कर सकते हैं 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
होगन

मुझे लगता है कि एक नया फ़ोन है बृहदान्त्र आपके नाम!
Redwolf प्रोग्राम्स

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

आप बस एक कंस्ट्रक्टर के प्रोटोटाइप पर लूप कर सकते हैं और सभी तरीकों को निकाल सकते हैं।


यह सीधे ऑब्जेक्ट से जुड़े तरीकों के लिए जिम्मेदार नहीं होगा
मैट ग्रीर

@MattGreer ने अपने उदाहरण को एक कंस्ट्रक्टर पर एक विधि कहा। चाहे वह एक निर्माता से विधियां चाहता हो या एक वस्तु एक अलग मामला है।
रेयानोस

1

सबसे अच्छा तरीका है:

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

केवल es6 में 'let' का उपयोग करें, इसके बजाय 'var' का उपयोग करें


1
यह विशेषताओं की एक सूची देता है।
अली बेन मेसाउद

जैसा कि अली ने कहा, यह एक वर्ग (विधियों) पर गेटर्स / सेटर के रूप में परिभाषित कार्यों को बाहर करता है।
शॉन

0

क्रोम में है 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];
    });
};
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.