কীভাবে কোনও অবজেক্টের সমস্ত পদ্ধতি প্রদর্শন করবেন?


249

আমি জানতে চাই যে কীভাবে কোনও সামগ্রীর জন্য উপলব্ধ সমস্ত পদ্ধতি তালিকাভুক্ত করতে হয়: উদাহরণস্বরূপ:

 alert(show_all_methods(Math));

এটি মুদ্রণ করা উচিত:

abs, acos, asin, atan, atan2, ceil, cos, exp, floor, log, max, min, pow, random,round, sin, sqrt, tan, 

উত্তর:


298

আপনি Object.getOwnPropertyNames()অবজেক্টের সাথে সম্পর্কিত সমস্ত সম্পত্তি পেতে ব্যবহার করতে পারবেন , তা গণ্য হোক বা না হোক। উদাহরণ স্বরূপ:

console.log(Object.getOwnPropertyNames(Math));
//-> ["E", "LN10", "LN2", "LOG2E", "LOG10E", "PI", ...etc ]

তারপরে আপনি filter()কেবলমাত্র পদ্ধতিগুলি ব্যবহার করতে পারেন :

console.log(Object.getOwnPropertyNames(Math).filter(function (p) {
    return typeof Math[p] === 'function';
}));
//-> ["random", "abs", "acos", "asin", "atan", "ceil", "cos", "exp", ...etc ]

ইএস 3 ব্রাউজারগুলিতে (আইই 8 এবং নিম্ন), অন্তর্নির্মিত বস্তুর বৈশিষ্ট্যগুলি গণনাযোগ্য নয়। অবজেক্টসগুলি পছন্দ মতো windowএবং documentঅন্তর্নির্মিত নয়, সেগুলি ব্রাউজার দ্বারা সংজ্ঞায়িত করা হয় এবং সম্ভবত নকশা দ্বারা গণনাযোগ্য।

থেকে ECMA-262 সংস্করণ 3 :

গ্লোবাল অবজেক্ট
একটি অনন্য গ্লোবাল অবজেক্ট (15.1) রয়েছে, যা নিয়ন্ত্রণের কোনও প্রয়োগের প্রসঙ্গে প্রবেশের আগে তৈরি হয়েছিল। প্রাথমিকভাবে গ্লোবাল অবজেক্টের নিম্নলিখিত বৈশিষ্ট্য রয়েছে:

• অন্তর্নির্মিত যেমন গণিত, স্ট্রিং, তারিখ, parseInt, ইত্যাদি বস্তু এই আছে বৈশিষ্ট্যাবলী {DontEnum}
Host অতিরিক্ত হোস্ট সংজ্ঞায়িত বৈশিষ্ট্য। এর মধ্যে এমন সম্পত্তি অন্তর্ভুক্ত থাকতে পারে যার মান বিশ্বব্যাপী অবজেক্ট; উদাহরণস্বরূপ, এইচটিএমএল ডকুমেন্ট অবজেক্ট মডেলটিতে গ্লোবাল অবজেক্টের উইন্ডো সম্পত্তি হ'ল গ্লোবাল অবজেক্ট।

নিয়ন্ত্রণ যেমন কার্যকরকরণ প্রসঙ্গে প্রবেশ করে এবং ইসিএমএসক্রিপ্ট কোড কার্যকর করা হয়, তত অতিরিক্ত বৈশিষ্ট্যগুলি বিশ্বব্যাপী অবজেক্টে যুক্ত হতে পারে এবং প্রাথমিক বৈশিষ্ট্যগুলি পরিবর্তিত হতে পারে।

আমার উল্লেখ করা উচিত যে এর অর্থ এই বস্তুগুলি গ্লোবাল অবজেক্টের অগণিত বৈশিষ্ট্য নয়। আপনি যদি বিশদটির নথিটির বাকী অংশটি সন্ধান করেন তবে আপনি দেখতে পাবেন যে এই সমস্ত বস্তুর অন্তর্নির্মিত বৈশিষ্ট্য এবং পদ্ধতিগুলির মধ্যে সেগুলিতে { DontEnum }বৈশিষ্ট্য সেট রয়েছে।


আপডেট: একজন সহকর্মী এসও ব্যবহারকারী, সিএমএস, আমার দৃষ্টি আকর্ষণ করার জন্য একটি আইই বাগ{ DontEnum } এনেছে ।

ডন্টইনাম বৈশিষ্ট্যটি পরীক্ষা করার পরিবর্তে, [মাইক্রোসফ্ট] জেএসক্রিপ্ট যে কোনও অবজেক্টের যে কোনও সম্পত্তির উপরে চলে যাবে যেখানে ডোনটেনাম বৈশিষ্ট্যযুক্ত অবজেক্টের প্রোটোটাইপ শৃঙ্খলে একই নামযুক্ত সম্পত্তি রয়েছে।

সংক্ষেপে, আপনার অবজেক্টের বৈশিষ্ট্যগুলির নামকরণের সময় সাবধান হন। যদি একই নামের কোনও অন্তর্নির্মিত প্রোটোটাইপ সম্পত্তি বা পদ্ধতি থাকে তবে for...inলুপ ব্যবহার করার সময় আইই এটি এড়িয়ে যাবে ।


অ্যান্ডি ই, এটি দেখানোর জন্য ধন্যবাদ। স্পষ্টতই আমি এ সম্পর্কে অবগত ছিলাম না এবং এটি খনন এবং এখানে এটি উল্লেখ করার জন্য আপনার প্রচেষ্টার প্রশংসা করি। আবারও ধন্যবাদ :)
রোল্যান্ড বোম্যান

@ রোল্যান্ড: কোনও উদ্বেগ নেই। সম্ভবত এটি কিছুটা দু: খজনক তবে আমার ডকুমেন্টস ফোল্ডারে স্পেসিফিকেশনটি সঞ্চিত আছে, তাই সত্যিকার অর্থে খুব বেশি খনন করার প্রয়োজন নেই!
অ্যান্ডি ই

নতুন জেএস বাস্তবায়নের সমস্ত পদ্ধতির তালিকা পাওয়ার কোনও উপায় নেই, তাহলে? নোড.জেএস এবং ভি 8 এর মতো? আমরা কীভাবে প্রতিবিম্ব এবং অন্তর্মস্পেক্ট অবজেক্টগুলি করতাম যেমন মক অবজেক্ট ফ্রেমওয়ার্ক ইত্যাদি? আমি ভেবেছিলাম আমি
জেএসকে

2
@ d11wtq, ES5 বাস্তবায়নের সাহায্যে আপনি আবেদন করতে পারবেন Object.getOwnPropertyNames(), যা অগণিত সম্পত্তি এবং পদ্ধতিগুলিও ফিরিয়ে দেবে।
অ্যান্ডি ই

যেহেতু সমস্ত বস্তু তাদের প্রোটোটাইপ থেকে উত্তরাধিকার সূত্রে আসে তাই এর মতো কিছু করা ভাল না Object.getOwnPropertyNames(Array.prototype) ?
lfender6445

71

ES3 এর মাধ্যমে এটি সম্ভব নয় কারণ বৈশিষ্ট্যের অভ্যন্তরীণ DontEnumবৈশিষ্ট্য রয়েছে যা আমাদের এই বৈশিষ্ট্যগুলি গণনা করা থেকে বিরত করে। অন্যদিকে, ES5 বৈশিষ্ট্যগুলির গণনা ক্ষমতা নিয়ন্ত্রণের জন্য সম্পত্তি বর্ণনাকারী সরবরাহ করে যাতে ব্যবহারকারী-সংজ্ঞায়িত এবং নেটিভ বৈশিষ্ট্যগুলি একই ইন্টারফেসটি ব্যবহার করতে পারে এবং একই ক্ষমতাগুলি উপভোগ করতে পারে, যার মধ্যে রয়েছে অগণিত বৈশিষ্ট্যগুলি প্রোগ্রামিকভাবে দেখতে সক্ষম হওয়া।

getOwnPropertyNamesফাংশন বস্তুর পাস, যারা অ-গণনীয় সমেত সমস্ত বৈশিষ্ট্যাবলী উপর গনা ব্যবহার করা যাবে। তারপরে typeofঅ-ফাংশনগুলি ফিল্টার করার জন্য একটি সাধারণ চেক নিয়োগ করা যেতে পারে। দুর্ভাগ্যক্রমে, ক্রোম একমাত্র ব্রাউজার যা বর্তমানে এটি কাজ করে।

function getAllMethods(object) {
    return Object.getOwnPropertyNames(object).filter(function(property) {
        return typeof object[property] == 'function';
    });
}

console.log(getAllMethods(Math));

["cos", "pow", "log", "tan", "sqrt", "ceil", "asin", "abs", "max", "exp", "atan2", "random", "round", "floor", "acos", "atan", "min", "sin"]কোন বিশেষ ক্রমে লগ ।


ES5 স্টাফের জন্য +1। আই 99 অবশ্যই ES5 কে পুরোপুরি সমর্থন করবে তাই এই স্টাফগুলি জানা ভাল।
অ্যান্ডি ই

1
@ অ্যান্ডি - মাইক্রোসফ্ট IE9 কে খুব গুরুত্বের সাথে নিচ্ছে যা আমাকে খুশি করে :)
অনুরাগ

কনসোল.লগ (ফাংশন (ক) {রিটার্ন অবজেক্ট.জেটঅনপ্রন্টি নামস (ক)। ফিল্টার (ফাংশন (খ) {রিটার্ন "ফাংশন" == টাইপ a [খ]})} (ম্যাথ)); ধন্যবাদ!
19

1
getOwnPropertyNames হল টিকিট। এমনকি এটি ন্যাশর্নেও কাজ করে। তারা কেবল জাভা অবজেক্টের পদ্ধতির নাম পরিবর্তন করেছে এবং আমি Object.getOwNPropertyNames (জাভা) চালিয়ে নতুন নামগুলি বের করতে সক্ষম হয়েছি
cayhorstmann

60
var methods = [];
for (var m in obj) {
    if (typeof obj[m] == "function") {
        methods.push(m);
    }
}
alert(methods.join(","));

এইভাবে, আপনি কল করতে পারেন এমন সমস্ত পদ্ধতি পাবেন obj। এর প্রোটোটাইপ ( getMethods()জাভা যেমন ) থেকে এটি "উত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতিগুলি অন্তর্ভুক্ত করে।" আপনি যদি কেবলমাত্র সেই পদ্ধতিগুলি সরাসরি দ্বারা সংজ্ঞায়িত করতে চান তবে objআপনি এটি পরীক্ষা করতে পারেন hasOwnProperty:

var methods = [];
for (var m in obj) {        
    if (typeof obj[m] == "function" && obj.hasOwnProperty(m)) {
        methods.push(m);
    }
}
alert(methods.join(","));

হ্যাঁ, আমি এটিও লক্ষ্য করছি। যখন আমি কিছুটা ব্যবহার করি documentবা windowআমি আরও ভাগ্য পাই। সত্যিই এটি কিছুটা অপ্রত্যাশিত, আমি জানি না কেন এটি ম্যাথ ইত্যাদির পক্ষে কাজ করে না
Roland Bouman

4
@ রোল্যান্ড: এটি কারণ documentএবং windowব্রাউজারের দ্বারা সরবরাহিত প্রচুর সংখ্যক সম্পত্তি রয়েছে, তারা স্ক্রিপ্টিং রানটাইমের অংশ নয়। নেটিভ অবজেক্টস এবং স্পষ্টতই বৈশিষ্ট্যগুলি অগণনীয় নয়।
অ্যান্ডি ই

1
যে কোনও ই, আমি স্বীকার করি না এটি সুস্পষ্ট। আমি বোঝাতে চাইছি যেহেতু আমরা এগুলি গণনা করতে পারি না বলে এটি স্পষ্ট। তবে কেন এই বিল্ট-ইনগুলি তাদের সম্পত্তিগুলির তালিকাবদ্ধকরণ আটকাতে হবে তা নিয়ে আমি যুক্তি দেখছি না। শুধু কৌতূহলী, মানকটির কিছু অংশ রয়েছে যা বলে যে এই বিল্ট-ইনগুলির অগণিত গুণাবলী থাকা উচিত নয়?
রোল্যান্ড বোম্যান

@ রোল্যান্ড: দুঃখিত, আমি বোঝাতে চাইছিলাম যে তারা স্পষ্টতই তারা গণনাযোগ্য নয়, কারণ তারা অন-ইন-এর সাথে দেখাবে না। অনুমান থেকে একটি উদ্ধৃতি জন্য নীচে আমার উত্তর দেখুন।
অ্যান্ডি ই

@ মিক: গণিত একটি অন্তর্নির্মিত অবজেক্ট যার বৈশিষ্ট্যগুলি অগণনীয় নয়।
অ্যান্ডি ই

31

সর্বাধিক আধুনিক ব্রাউজার সমর্থন console.dir(obj), যা এটি তার নির্মাণকারীর মাধ্যমে উত্তরাধিকার সূত্রে প্রাপ্ত কোনও সামগ্রীর সমস্ত সম্পত্তি ফিরিয়ে দেবে। আরও তথ্য এবং বর্তমান ব্রাউজার সমর্থনের জন্য মজিলার ডকুমেন্টেশন দেখুন।

console.dir(Math)
=> MathConstructor
E: 2.718281828459045
LN2: 0.6931471805599453
...
tan: function tan() { [native code] }
__proto__: Object

4

এখানে অন্যান্য উত্তরগুলি ম্যাথের মতো কোনও কিছুর জন্য কাজ করে যা একটি স্ট্যাটিক অবজেক্ট। তবে তারা কোনও বস্তুর উদাহরণ যেমন কোনও তারিখের জন্য কাজ করে না । আমি নিম্নলিখিত কাজগুলি খুঁজে পেয়েছি:

function getMethods(o) {
  return Object.getOwnPropertyNames(Object.getPrototypeOf(o))
    .filter(m => 'function' === typeof o[m])
}
//example: getMethods(new Date()):  [ 'getFullYear', 'setMonth', ... ]

https://jsfiddle.net/3xrsead0/

এটি আসল প্রশ্ন (ম্যাথ) এর মতো কোনও কিছুর জন্য কাজ করবে না , সুতরাং আপনার প্রয়োজনের ভিত্তিতে সমাধানটি বেছে নিন। আমি এটি এখানে পোস্ট করছি কারণ গুগল আমাকে এই প্রশ্নে প্রেরণ করেছে তবে আমি কীভাবে অবজেক্টগুলির উদাহরণ হিসাবে এটি করতে পারি তা জানতে চাইছিলাম।


3

সংক্ষিপ্ত উত্তরটি আপনি পারবেন না কারণ Mathএবং Date(আমার মাথার উপরের অংশে, আমি নিশ্চিত যে অন্যরাও রয়েছেন) সাধারণ বস্তু নয়। এটি দেখতে, একটি সাধারণ পরীক্ষা স্ক্রিপ্ট তৈরি করুন:

<html>
  <body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
    <script type="text/javascript">
      $(function() {
        alert("Math: " + Math);
        alert("Math: " + Math.sqrt);
        alert("Date: " + Date);
        alert("Array: " + Array);
        alert("jQuery: " + jQuery);
        alert("Document: " + document);
        alert("Document: " + document.ready);
      });
    </script>
  </body>
</html>

আপনি দেখতে পান যে এটি কোনও বিষয়টিকে একইভাবে নথী হিসাবে একইভাবে উপস্থাপিত করে, তবে আপনি যখন বাস্তবে চেষ্টা করে দেখুন এবং সেই বস্তুটি দেখেন তখন আপনি দেখতে পাবেন যে এটি একটি নেটিভ কোড এবং কিছু গণনা করার জন্য একইভাবে উদ্ভাসিত হয়নি।


1

Mathস্ট্যাটিক পদ্ধতি যেখানে তোমার মত সরাসরি কল করতে পারেন Math.abs()যখন Dateমত স্ট্যাটিক পন্থা নেই Date.now()এবং উদাহরণস্বরূপ পদ্ধতি যেখানে আপনি প্রথম নতুন দৃষ্টান্ত তৈরি করতে হবে var time = new Date()কলে time.getHours()

// The instance method of Date can be found on `Date.prototype` so you can just call:
var keys = Object.getOwnPropertyNames(Date.prototype);

// And for the static method
var keys = Object.getOwnPropertyNames(Date);

// But if the instance already created you need to
// pass its constructor
var time = new Date();
var staticKeys = Object.getOwnPropertyNames(time.constructor);
var instanceKeys = Object.getOwnPropertyNames(time.constructor.prototype);

অবশ্যই আপনাকে আসল পদ্ধতির নামগুলি পেতে স্ট্যাটিক পদ্ধতির জন্য প্রাপ্ত কীগুলি ফিল্টার করতে হবে , কারণ আপনি এটি পেতে পারেন length, nameযেগুলি তালিকায় কোনও ফাংশন নয়।

কিন্তু কীভাবে আমরা যদি অন্য শ্রেণীর প্রসারিত ক্লাস থেকে সমস্ত উপলব্ধ পদ্ধতি অর্জন করতে চাই?
অবশ্যই আপনার ব্যবহারের মতো প্রোটোটাইপের মূলটি স্ক্যান করতে হবে __proto__। আপনার সময় সাশ্রয়ের জন্য আপনি স্থিতিশীল পদ্ধতি এবং গভীর পদ্ধতির উদাহরণ পেতে নীচের স্ক্রিপ্টটি ব্যবহার করতে পারেন।

// var keys = new Set();
function getStaticMethods(keys, clas){
    var keys2 = Object.getOwnPropertyNames(clas);

    for(var i = 0; i < keys2.length; i++){
        if(clas[keys2[i]].constructor === Function)
            keys.add(keys2[i]);
    }
}

function getPrototypeMethods(keys, clas){
    if(clas.prototype === void 0)
        return;

    var keys2 = Object.getOwnPropertyNames(clas.prototype);
    for (var i = keys2.length - 1; i >= 0; i--) {
        if(keys2[i] !== 'constructor')
            keys.add(keys2[i]);
    }

    var deep = Object.getPrototypeOf(clas);
    if(deep.prototype !== void 0)
        getPrototypeMethods(keys, deep);
}

// ====== Usage example ======
// To avoid duplicate on deeper prototype we use `Set`
var keys = new Set();
getStaticMethods(keys, Date);
getPrototypeMethods(keys, Date);

console.log(Array.from(keys));

যদি আপনি তৈরি করা উদাহরণ থেকে পদ্ধতিগুলি পেতে চান তবে constructorএটির পাসটি করতে ভুলবেন না।


0

আমি বিশ্বাস করি যে অ্যারির মতো বিল্ট-ইন অবজেক্টগুলির উদাহরণগুলির জন্য আপনি গণনা করতে না পারার একটি সাধারণ historicalতিহাসিক কারণ রয়েছে। কারণটা এখানে:

পদ্ধতিগুলি হ'ল প্রোটোটাইপ-অবজেক্টের বৈশিষ্ট্য, অবজেক্ট.প্রোটোটাইপ বলে। এর অর্থ হ'ল সমস্ত অবজেক্ট-দৃষ্টান্তগুলি সেই পদ্ধতিগুলির উত্তরাধিকারী হবে। এজন্য আপনি যে কোনও বস্তুতে এই পদ্ধতিগুলি ব্যবহার করতে পারেন। উদাহরণস্বরূপ .toString () বলুন।

সুতরাং যদি পদ্ধতিগুলি ছিল অগণনীয়, এবং আমি {a: 123 say এর সাথে পুনরাবৃত্তি করব: "জন্য ({a: 123 in এর কী) {... what" কী হবে? কতবার এই লুপটি কার্যকর করা হবে?

আমাদের উদাহরণে এটি একবার সিঙ্গেল কী 'এ' এর জন্য পুনরাবৃত্তি হবে। কিন্তু যে জন্য একবার গণনীয় হল Object.prototype এর সম্পত্তি। সুতরাং যদি পদ্ধতিগুলি (ডিফল্টরূপে) অগণনীয় হয় তবে যে কোনও বস্তুর উপর যে কোনও লুপ তার উত্তরাধিকারসূত্রে প্রাপ্ত সমস্ত পদ্ধতিতেও লুপ করবে would


1
যেহেতু আদিমরা সাধারণত একটি প্রোটাইপ থেকে উত্তরাধিকারী হয়, Object.getOwnPropertyNames(Array.prototype)উদাহরণস্বরূপ এটি সম্ভব
lfender6445

আপনার কী অর্থ পদ্ধতিগুলি অবজেক্ট.প্রোটোটাইপের বৈশিষ্ট্য। ? প্রতিটি সম্পত্তি অবজেক্টের ক্ষেত্রে
অবজেক্ট.প্রোটোটাইপের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.