কোনও বস্তুর ধরণের নাম পান


1193

সেখানে একটি হল জাভাস্ক্রিপ্ট সমতুল্য জাভা এর class.getName()?


এই প্রশ্নটি অনুমান করে যে আমরা জানি জাভার ক্লাস.সেটনাম () কী করে। যেহেতু আমি নিশ্চিত নই যে উত্তরগুলি আমাকে সাহায্য করবে কিনা।
ব্যবহারকারী 34660

2
@ ব্যবহারকারী 34660 আমি মনে করি আমরা নিরাপদে ধরে নিতে পারি যে এটি যা করে তা কোনও বস্তুর ধরণের নাম পায়।
স্ট্যাক করুন

1
@ স্ট্যাকউন্ডারফ্লো: বাদে আসলে তা হয় না। এটি একটি বস্তুর নাম পায় বর্গ , যা না একটি বস্তু এর হিসাবে একই ধরনের
জার্গ ডব্লু মিট্টাগ

1
@ জার্গডব্লিউমিতাগ হ্যাঁ অবশ্যই, ইয়া দেখুন আপনি নিরাপদে জিনিস ধরে নিয়ে ঘুরে দেখলে কী হয়?
স্ট্যাক Underflow

উত্তর:


1540

জাভা স্ক্রিপ্ট সমান জাভা আছে class.getName()?

কোন

ES2015 আপডেট : নাম class Foo {}হলFoo.name । নাম thingএর বর্গ, নির্বিশেষে thingএর ধরন, হয় thing.constructor.name। একটি ES2015 পরিবেশে বিল্টিন নির্মাণকারীদের সঠিক nameসম্পত্তি আছে; উদাহরণস্বরূপ (2).constructor.nameহয় "Number"


তবে এখানে বিভিন্ন হ্যাক রয়েছে যা সমস্তই একরকম বা অন্যভাবে পড়ে যায়:

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

Object.prototype.getName = function() { 
   var funcNameRegex = /function (.{1,})\(/;
   var results = (funcNameRegex).exec((this).constructor.toString());
   return (results && results.length > 1) ? results[1] : "";
};

এখন, আপনার সমস্ত বস্তুর ফাংশন থাকবে getName(), যা স্ট্রিং হিসাবে কনস্ট্রাক্টরের নাম ফিরিয়ে দেবে। আমি এটি পরীক্ষা করেছি FF3এবং IE7, আমি অন্যান্য প্রয়োগের জন্য কথা বলতে পারি না।

আপনি যদি এটি না করতে চান তবে জাভাস্ক্রিপ্টে ধরণ নির্ধারণের বিভিন্ন উপায় নিয়ে এখানে আলোচনা ...


আমি সম্প্রতি এটি আপডেট করেছি কিছুটা বেশি পরিস্রাব্য, যদিও এটি খুব কমই। সংশোধন স্বাগত ...

constructorসম্পত্তি ব্যবহার করা হচ্ছে ...

প্রত্যেকের objectতার constructorসম্পত্তির জন্য একটি মান রয়েছে তবে কীভাবে এটি নির্মিত objectহয়েছিল এবং সেই মানটির সাথে আপনি কী করতে চান তার উপর নির্ভর করে এটি কার্যকর হতে পারে বা নাও পারে।

সাধারণভাবে বলতে গেলে, আপনি constructorএই জাতীয় বস্তুর প্রকারের পরীক্ষা করতে সম্পত্তিটি ব্যবহার করতে পারেন :

var myArray = [1,2,3];
(myArray.constructor == Array); // true

সুতরাং, এটি বেশিরভাগ প্রয়োজনের জন্য যথেষ্ট ভাল কাজ করে। বলেছিল ...

আদেশ সহকারে

অনেক ক্ষেত্রে সব ক্ষেত্রেই কাজ করবে না

এই প্যাটার্নটি যদিও ভাঙা, বেশ সাধারণ:

function Thingy() {
}
Thingy.prototype = {
    method1: function() {
    },
    method2: function() {
    }
};

Objectsমাধ্যমে নির্মিত new Thingyএকটি constructorসম্পত্তি আছে যে পয়েন্ট Object, না Thingy। সুতরাং আমরা ঠিক শুরুতে পড়ে; আপনি কেবল constructorএমন কোনও কোডবেসে বিশ্বাস রাখতে পারবেন না যা আপনি নিয়ন্ত্রণ করেন না।

একাধিক উত্তরাধিকার

এটি যেমন সুস্পষ্ট নয় এমন উদাহরণ হ'ল একাধিক উত্তরাধিকার ব্যবহার:

function a() { this.foo = 1;}
function b() { this.bar = 2; }
b.prototype = new a(); // b inherits from a

আপনি এখন যেমনটি প্রত্যাশা করতে পারেন তেমন কাজ করে না:

var f = new b(); // instantiate a new object with the b constructor
(f.constructor == b); // false
(f.constructor == a); // true

সুতরাং, যদি objectআপনার পরীক্ষার কোনও আলাদা objectসেট থাকে তবে আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন prototype। এই আলোচনার পরিধি বাইরে এর চারপাশে উপায় আছে।

constructorসম্পত্তির জন্য অন্যান্য ব্যবহার রয়েছে , তাদের কয়েকটি আকর্ষণীয়, অন্যগুলি এতটা নয়; এই মুহূর্তে আমরা সেগুলি ব্যবহার করব না কারণ এটি এই আলোচনার সাথে প্রাসঙ্গিক নয়।

ক্রস ফ্রেম এবং ক্রস উইন্ডো কাজ করবে না

ব্যবহার .constructorটাইপ পরীক্ষণের জন্য যখন আপনি বিভিন্ন থেকে আসছে বস্তু ধরণ চেক করতে চান ভঙ্গ করবে windowবস্তু, একটি iframe অথবা একটি পপআপ উইন্ডো যে বলে। এটি কারণ constructorপ্রতিটি `উইন্ডোতে প্রতিটি কোর ধরণের আলাদা সংস্করণ রয়েছে , অর্থাত্‍

iframe.contentWindow.Array === Array // false

instanceofঅপারেটরটি ব্যবহার করা হচ্ছে ...

instanceofঅপারেটর পরীক্ষার একটি পরিষ্কার উপায় objectঠিক পাশাপাশি টাইপ, কিন্তু তার নিজের সম্ভাব্য বিষয় আছে, constructorসম্পত্তি।

var myArray = [1,2,3];
(myArray instanceof Array); // true
(myArray instanceof Object); // true

কিন্তু instanceofআক্ষরিক মানগুলির জন্য কাজ করতে ব্যর্থ হয় (কারণ আক্ষরিক হয় না Objects)

3 instanceof Number // false
'abc' instanceof String // false
true instanceof Boolean // false

উদাহরণস্বরূপ, কাজ Objectকরার জন্য আক্ষরিকগুলিকে একটি মোড়ানো প্রয়োজনinstanceof

new Number(3) instanceof Number // true

.constructorচেক লিটারেল জন্য কাজ করে জরিমানা কারণ .পদ্ধতি আবাহন পরোক্ষভাবে তাদের নিজ নিজ বস্তুর ধরনের লিটারেল গোপন

3..constructor === Number // true
'abc'.constructor === String // true
true.constructor === Boolean // true

কেন তিনটি বিন্দু 3? কারণ জাভাস্ক্রিপ্ট প্রথম বিন্দুকে দশমিক পয়েন্ট হিসাবে ব্যাখ্যা করে;)

ক্রস ফ্রেম এবং ক্রস উইন্ডো কাজ করবে না

instanceofconstructorসম্পত্তি চেক হিসাবে একই কারণে বিভিন্ন উইন্ডো জুড়েও কাজ করবে না ।


nameসম্পত্তির সম্পত্তি ব্যবহার করে constructor...

অনেক ক্ষেত্রে সব ক্ষেত্রেই কাজ করে না

আবার উপরে দেখুন; constructorপুরোপুরি এবং সম্পূর্ণরূপে ভুল এবং অকেজো হওয়া এটি বেশ সাধারণ ।

<আই 9 এ কাজ করে না

ব্যবহার myObjectInstance.constructor.nameআপনাকে constructorব্যবহৃত ফাংশনটির নাম যুক্ত একটি স্ট্রিং দেবে , তবে constructorপূর্বে উল্লিখিত সম্পত্তি সম্পর্কে সতর্কতার অধীনে ।

আইই 9 এবং তারপরের জন্য, আপনি সমর্থনে বানর-প্যাচ করতে পারেন :

if (Function.prototype.name === undefined && Object.defineProperty !== undefined) {
    Object.defineProperty(Function.prototype, 'name', {
        get: function() {
            var funcNameRegex = /function\s+([^\s(]+)\s*\(/;
            var results = (funcNameRegex).exec((this).toString());
            return (results && results.length > 1) ? results[1] : "";
        },
        set: function(value) {}
    });
}

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

if (Function.prototype.name === undefined && Object.defineProperty !== undefined) {
    Object.defineProperty(Function.prototype, 'name', {
        get: function() {
            var funcNameRegex = /function\s([^(]{1,})\(/;
            var results = (funcNameRegex).exec((this).toString());
            return (results && results.length > 1) ? results[1].trim() : "";
        },
        set: function(value) {}
    });
}

অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং ব্যবহার করা

দেখা যাচ্ছে যে এই পোস্টের বিবরণ হিসাবে আপনি ব্যবহার করতে পারেন Object.prototype.toString- নিম্ন-স্তরের এবং জেনেরিক প্রয়োগ toString- সমস্ত অন্তর্নির্মিত ধরণের জন্য টাইপ পেতে

Object.prototype.toString.call('abc') // [object String]
Object.prototype.toString.call(/abc/) // [object RegExp]
Object.prototype.toString.call([1,2,3]) // [object Array]

একটি যেমন একটি সংক্ষিপ্ত সহায়ক ফাংশন লিখতে পারে

function type(obj){
    return Object.prototype.toString.call(obj).slice(8, -1);
}

ক্রাফ্টটি সরাতে এবং কেবল টাইপের নাম পেতে

type('abc') // String

তবে এটি Objectসমস্ত ব্যবহারকারী-সংজ্ঞায়িত প্রকারের জন্য ফিরে আসবে ।


সকলের জন্য গুহাত ...

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

// using a named function:
function Foo() { this.a = 1; }
var obj = new Foo();
(obj instanceof Object);          // true
(obj instanceof Foo);             // true
(obj.constructor == Foo);         // true
(obj.constructor.name == "Foo");  // true

// let's add some prototypical inheritance
function Bar() { this.b = 2; }
Foo.prototype = new Bar();
obj = new Foo();
(obj instanceof Object);          // true
(obj instanceof Foo);             // true
(obj.constructor == Foo);         // false
(obj.constructor.name == "Foo");  // false


// using an anonymous function:
obj = new (function() { this.a = 1; })();
(obj instanceof Object);              // true
(obj.constructor == obj.constructor); // true
(obj.constructor.name == "");         // true


// using an anonymous function assigned to a variable
var Foo = function() { this.a = 1; };
obj = new Foo();
(obj instanceof Object);      // true
(obj instanceof Foo);         // true
(obj.constructor == Foo);     // true
(obj.constructor.name == ""); // true


// using object literal syntax
obj = { foo : 1 };
(obj instanceof Object);            // true
(obj.constructor == Object);        // true
(obj.constructor.name == "Object"); // true

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

বিঃদ্রঃ:

আলোচনা typeofঅপারেটর একটি জ্বলজ্বলে ভ্রান্তি বলে মনে হতে পারে, কিন্তু এটা সত্যিই একটি কিনা শনাক্ত করার জন্য সাহায্য দরকারী নয় objectযেহেতু এটি খুব সরল হয়, একটি প্রদত্ত প্রকার। কোথায় typeofদরকারী তা বোঝা গুরুত্বপূর্ণ, তবে বর্তমানে আমি মনে করি না যে এটি এই আলোচনার সাথে মারাত্মকভাবে প্রাসঙ্গিক। আমার মন যদিও পরিবর্তনের জন্য উন্মুক্ত। :)


58
ঠিক আছে, আমি অনুভব করেছি আমিও সম্ভবত এটি করতে পারি - স্ট্যাক ওভারফ্লো এর বিন্দুটি উইকের মতো কিছুটা হওয়া উচিত, এবং এটি সেই উদ্দেশ্যটির সাথে সামঞ্জস্যপূর্ণ, আমি মনে করি। নির্বিশেষে, আমি কেবল কিছুটা সুস্থ হতে চাই।
জেসন বুটিং

নীচে একটি উত্তর পুনরায় পুনরুক্তি করা --- অবজেক্ট প্রোটোটাইপের আপনার এক্সটেনশন আইই 8 তে কাজ করে না - কেউ কি জানেন যে আইই 8 তে কাজ করবে?
আদম

5
আপনি যদি এই ফাংশনটি a () {this.a = 1;} ফাংশন বি () {this.b = 2 এর মতো করেন তবে এটি কাজ করবে; } বি.প্রোটোটাইপ = নতুন এ (); একটি বি.প্রোটোটাইপ.কমস্ট্রাক্টর থেকে // বি উত্তরাধিকারী = বি; // প্রোটোটাইপিকাল উত্তরাধিকারের সঠিক উপায় var f = new b (); // বি কনস্ট্রাক্টর দিয়ে নতুন অবজেক্ট তৈরি করুন (f.constructor == খ); // সত্য (f.constructor == ক); // মিথ্যা
বোরিস হামানভ

9
এখন, বেশিরভাগ উত্তরগুলি স্ট্যাকওভারফ্লোতে হওয়া উচিত। (একটি সংজ্ঞায়িত প্যারামিটার হিসাবে উত্তরের দৈর্ঘ্য গ্রহণ করবেন না, তবে ব্যাপকতা)
কুমারহর্ষ

44
এটি লক্ষণীয় গুরুত্বপূর্ণ যে আপনার জাভাস্ক্রিপ্টটি uglify, বা রেলসেট সম্পদ পাইপলাইনের মতো কোনও সরঞ্জামের সাহায্যে মিনিমাইজ করা থাকলে অবজেক্টের constructorপদ্ধতির (যেগুলি দিয়ে .toString()বা হয় .name) পরীক্ষা করে এমন কোনও কৌশল কাজ করতে ব্যর্থ হবে। সংক্ষিপ্তকরণটি কনস্ট্রাক্টরের নাম পরিবর্তন করে, তাই আপনার মতো ভুল শ্রেণীর নাম শেষ হবে n। আপনি যদি এই দৃশ্যে থাকেন তবে আপনি নিজের বস্তুর উপর কোনও সম্পত্তি নিজেই সংজ্ঞায়িত করতে পারেন classNameএবং তার পরিবর্তে এটি ব্যবহার করতে পারেন।
গ্যাব মার্টিন-ড্যাম্পেসি

126

জেসন বুটিংয়ের উত্তর আমাকে যা প্রয়োজন তা সন্ধান করার জন্য যথেষ্ট পরিমাণে একটি ক্লু দিয়েছে:

<<Object instance>>.constructor.name

সুতরাং, উদাহরণস্বরূপ, নিম্নলিখিত কোডের টুকরাটিতে:

function MyObject() {}
var myInstance = new MyObject();

myInstance.constructor.nameফিরে আসবে "MyObject"


22
সম্পূর্ণতার জন্য, এটি উল্লেখযোগ্য হতে পারে যে কনস্ট্রাক্টর.নাম ব্যবহার করা কেবল তখনই কাজ করে যদি আপনি কোনও ভেরিয়েবলের জন্য নির্ধারিত একটি বেনামী ফাংশনের বিপরীতে কনস্ট্রাক্টর হিসাবে একটি নামকৃত ফাংশন ব্যবহার করেন।
ম্যাথু ক্রামলে 22

20
সম্পূর্ণতার জন্য, এটি উল্লেখযোগ্য যে এটি আই ব্রাউজারগুলিতে কাজ করে না --- তারা ফাংশনগুলিতে "নাম" গুণকে সমর্থন করে না।
ইউজিন লাজুতিন

2
@ ইউজিন - আমি সে সম্পর্কে ভুলে গিয়েছি ... আমার ধারণা আমি ব্রাউজারগুলির বাইরে জাভাস্ক্রিপ্ট করতে অনেক বেশি সময় ব্যয় করেছি।
ম্যাথু ক্রামলে

2
function getType(o) { return o && o.constructor && o.constructor.name }
justin.m.chase

এটি এসও ব্যাপক।
আইবিক

26

আমি একটি ছোট কৌশল ব্যবহার করি:

function Square(){
    this.className = "Square";
    this.corners = 4;
}

var MySquare = new Square();
console.log(MySquare.className); // "Square"

11
আমি বিশেষত এটি পছন্দ করি না। এটি আরও এক ধরণের নোংরা কৌশল। অন্যদিকে, আপনার যদি খুব বেশি কনস্ট্রাক্টর না থাকে তবে এটি ঠিক কাজ করতে পারে।
pimvdb

13
@ পিমভিডিবি: আমি মনে করি এটি বস্তুর প্রোটোটাইপ পরিবর্তনের চেয়ে পরিষ্কার, এটি একটি গৃহীত উত্তর।
ড্যানিয়েল জাজো

4
@ ড্যানিয়েলজাবো যদি কোনও প্রোটোটাইপের সমস্ত দৃষ্টান্তের মধ্যে কোনও মানের সমান মান থাকতে পারে তবে আমি অবশ্যই এটি প্রোটোটাইপের উপর রেখে দেওয়া পছন্দ করি - প্রতিটি উদাহরণে এটি রাখা অতি-রিডানডেন্ট এবং মেটাডেটা প্রোটোটাইপ থেকে অনুপস্থিত। এটি বলেছিল, বুদ্ধিমান সমাধানটি ES6 এ গৃহীত হয়েছিল: আপনার যদি থাকে class Squareতবে নামটি Square.name/ MySquare.constructor.nameপরিবর্তে Square.prototype.name; nameকনস্ট্রাক্টর ফাংশনটি রেখে এটি প্রোটোটাইপ বা কোনও উদাহরণকে দূষিত করে না, তবে তা উভয় থেকেই অ্যাক্সেসযোগ্য।
অ্যান্ডি

17

হালনাগাদ

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

Object.prototype.getConstructorName = function () {
   var str = (this.prototype ? this.prototype.constructor : this.constructor).toString();
   var cname = str.match(/function\s(\w*)/)[1];
   var aliases = ["", "anonymous", "Anonymous"];
   return aliases.indexOf(cname) > -1 ? "Function" : cname;
}

new Array().getConstructorName();  // returns "Array"
(function () {})().getConstructorName(); // returns "Function"

 


দ্রষ্টব্য: নীচের উদাহরণটি হ্রাস করা হয়েছে।

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

if (!Object.prototype.getClassName) {
    Object.prototype.getClassName = function () {
        return Object.prototype.toString.call(this).match(/^\[object\s(.*)\]$/)[1];
    }
}

var test = [1,2,3,4,5];

alert(test.getClassName()); // returns Array

2
সুন্দর, তবে আমরা আবার নামকরণ করছি: জেএস এর ক্লাস নেই।
মাইকমেকানা

@ এনেলার ​​- আমি আপডেট করা ফাংশনটি ব্যবহার করার পরামর্শ দিচ্ছি, পুরানোটি কেবল historicতিহাসিক কারণে রাখা হয়েছে।
শৌল

এটি কাজ করে তবে এটি লক্ষ্য করা উচিত যে এটি অবজেক্ট.প্রোটোটাইপটি পরিবর্তন না করেই একটি ফাংশন তৈরি করে যা বস্তুকে প্রথম আর্গুমেন্ট হিসাবে গ্রহণ করে এবং ফাংশনের ভিতরে 'এই' এর পরিবর্তে এটি ব্যবহার করে।
ম্যাট ব্রাউন

2
@ ম্যাট - অবশ্যই এটি কেবলমাত্র একটি অবজেক্ট পদ্ধতি থাকা আরও সংশ্লেষিত: test.getClassName()বনাম getClassName.apply(test)
শৌল

12

অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং ব্যবহার করা

দেখা যাচ্ছে যে এই পোস্টের বিবরণ হিসাবে, আপনি অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং ব্যবহার করতে পারেন - টোস্ট্রিংয়ের নিম্ন স্তরের এবং জেনেরিক প্রয়োগ - সমস্ত অন্তর্নির্মিত ধরণের জন্য টাইপ পেতে

Object.prototype.toString.call('abc') // [object String]
Object.prototype.toString.call(/abc/) // [object RegExp]
Object.prototype.toString.call([1,2,3]) // [object Array]

একটি যেমন একটি সংক্ষিপ্ত সহায়ক ফাংশন লিখতে পারে

function type(obj){
    return Object.prototype.toString.call(obj]).match(/\s\w+/)[0].trim()
}

return [object String] as String
return [object Number] as Number
return [object Object] as Object
return [object Undefined] as Undefined
return [object Function] as Function

6
অবজেক্টের নামটি বিশ্লেষণ করার জন্য আপনাকে রেইজেক্স ব্যবহার করার দরকার নেই। কেবলমাত্র ব্যবহার করুন .slice():Object.prototype.toString.call(obj).slice( 8, -1 );
বোবোবো

9

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

function getType(o) {
    return Object.prototype.toString.call(o).match(/^\[object\s(.*)\]$/)[1];
}
function isInstance(obj, type) {
    var ret = false,
    isTypeAString = getType(type) == "String",
    functionConstructor, i, l, typeArray, context;
    if (!isTypeAString && getType(type) != "Function") {
        throw new TypeError("type argument must be a string or function");
    }
    if (obj !== undefined && obj !== null && obj.constructor) {
        //get the Function constructor
        functionConstructor = obj.constructor;
        while (functionConstructor != functionConstructor.constructor) {
            functionConstructor = functionConstructor.constructor;
        }
        //get the object's window
        context = functionConstructor == Function ? self : functionConstructor("return window")();
        //get the constructor for the type
        if (isTypeAString) {
            //type is a string so we'll build the context (window.Array or window.some.Type)
            for (typeArray = type.split("."), i = 0, l = typeArray.length; i < l && context; i++) {
                context = context[typeArray[i]];
            }
        } else {
            //type is a function so execute the function passing in the object's window
            //the return should be a constructor
            context = type(context);
        }
        //check if the object is an instance of the constructor
        if (context) {
            ret = obj instanceof context;
            if (!ret && (type == "Number" || type == "String" || type == "Boolean")) {
                ret = obj.constructor == context
            }
        }
    }
    return ret;
}

isInstance দুটি পরামিতি প্রয়োজন: একটি বস্তু এবং একটি প্রকার। এটি কীভাবে কাজ করে তার আসল কৌশলটি হ'ল এটিটি একই উইন্ডো থেকে আসে কিনা এবং যদি বস্তুর উইন্ডো না পায় তা পরীক্ষা করে।

উদাহরণ:

isInstance([], "Array"); //true
isInstance("some string", "String"); //true
isInstance(new Object(), "Object"); //true

function Animal() {}
function Dog() {}
Dog.prototype = new Animal();

isInstance(new Dog(), "Dog"); //true
isInstance(new Dog(), "Animal"); //true
isInstance(new Dog(), "Object"); //true
isInstance(new Animal(), "Dog"); //false

টাইপ আর্গুমেন্ট একটি কলব্যাক ফাংশনও হতে পারে যা কোনও কনস্ট্রাক্টরকে ফেরত দেয়। কলব্যাক ফাংশনটি এমন একটি প্যারামিটার গ্রহণ করবে যা প্রদত্ত বস্তুর উইন্ডো।

উদাহরণ:

//"Arguments" type check
var args = (function() {
    return arguments;
}());

isInstance(args, function(w) {
    return w.Function("return arguments.constructor")();
}); //true

//"NodeList" type check
var nl = document.getElementsByTagName("*");

isInstance(nl, function(w) {
    return w.document.getElementsByTagName("bs").constructor;
}); //true

একটি বিষয় মনে রাখবেন যে আইই <9 সমস্ত কন্ট্রাক্টরকে কন্ট্রাক্টর সরবরাহ করে না তাই নোডলিস্টের জন্য উপরের পরীক্ষাটি মিথ্যা ফিরে আসবে এবং একটি আইসনস্ট্যান্স (সতর্কতা, "ফাংশন") মিথ্যা ফিরে আসবে।


8

আমি আসলে একটি অনুরূপ জিনিস খুঁজছিলাম এবং এই প্রশ্ন জুড়ে এসেছিল। এখানে আমি কীভাবে প্রকারগুলি পাই : jsfiddle

var TypeOf = function ( thing ) {

    var typeOfThing = typeof thing;

    if ( 'object' === typeOfThing ) {

        typeOfThing = Object.prototype.toString.call( thing );

        if ( '[object Object]' === typeOfThing ) {

            if ( thing.constructor.name ) {
                return thing.constructor.name;
            } 

            else if ( '[' === thing.constructor.toString().charAt(0) ) {
                typeOfThing = typeOfThing.substring( 8,typeOfThing.length - 1 );
            } 

            else {

                typeOfThing = thing.constructor.toString().match( /function\s*(\w+)/ );

                if ( typeOfThing ) { 
                    return typeOfThing[1];
                } 

                else {
                    return 'Function';
                }
            }
        } 

        else {
            typeOfThing = typeOfThing.substring( 8,typeOfThing.length - 1 );
        }
    }

    return typeOfThing.charAt(0).toUpperCase() + typeOfThing.slice(1);
}

7

আপনার somevar.constructor.nameমতো ব্যবহার করা উচিত :

    
    const getVariableType = a => a.constructor.name.toLowerCase();

    const d = new Date();
    const res1 = getVariableType(d); // 'date'
    const num = 5;
    const res2 = getVariableType(num); // 'number'
    const fn = () => {};
    const res3 = getVariableType(fn); // 'function'

    console.log(res1); // 'date'
    console.log(res2); // 'number'
    console.log(res3); // 'function'


6

constructor.nameআপনি যখন পারবেন তখন ব্যবহার করুন , এবং যখন আমি না পারি তখন রেজেজেক্স ফাংশন।

Function.prototype.getName = function(){
  if (typeof this.name != 'undefined')
    return this.name;
  else
    return /function (.+)\(/.exec(this.toString())[1];
};

6

আগাভ.জেএস এর ধরণের () ফাংশনটি ফিরে আসবে:

  • উত্তরাধিকার গাছের নিকটতম প্রোটোটাইপ
  • সর্বদা আদিম নাম যেমন 'নাল' এবং 'অপরিজ্ঞাত', আদিম নাম।

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

নাম্বার

kind(37) === 'Number'
kind(3.14) === 'Number'
kind(Math.LN2) === 'Number'
kind(Infinity) === 'Number'
kind(Number(1)) === 'Number'
kind(new Number(1)) === 'Number'

NaN

kind(NaN) === 'NaN'

স্ট্রিংস

kind('') === 'String'
kind('bla') === 'String'
kind(String("abc")) === 'String'
kind(new String("abc")) === 'String'

booleans

kind(true) === 'Boolean'
kind(false) === 'Boolean'
kind(new Boolean(true)) === 'Boolean'

অ্যারেগুলির

kind([1, 2, 4]) === 'Array'
kind(new Array(1, 2, 3)) === 'Array'

অবজেক্টস

kind({a:1}) === 'Object'
kind(new Object()) === 'Object'

তারিখ

kind(new Date()) === 'Date'

ক্রিয়াকলাপ

kind(function(){}) === 'Function'
kind(new Function("console.log(arguments)")) === 'Function'
kind(Math.sin) === 'Function'

অনির্দিষ্ট

kind(undefined) === 'undefined'

খালি

kind(null) === 'null'

5

আপনি instanceofঅপারেটরটি দেখতে কোনও বস্তুর অন্যের উদাহরণ কিনা তা দেখতে ব্যবহার করতে পারেন , তবে যেহেতু কোনও ক্লাস নেই তাই আপনি কোনও শ্রেণীর নাম পেতে পারেন না।


যদিও এটি সত্য যে জাভাস্ক্রিপ্টের ভাষা নির্মানের মতো ক্লাস নেই, জেনেরিক কনভেনশনটি এখনও রয়েছে যে কোনও ধরণের কোনও বস্তুকে শ্রেণি বলা হয় ..
শৌল

2
@ গ্রেগ শিওর কিন্তু instanceofকেবল কোনও বস্তু অন্য বস্তুর উত্তরাধিকার সূত্রে পরীক্ষা করে। উদাহরণস্বরূপ, []অ্যারে থেকে একটি সাধারণ উত্তরাধিকারসূত্রে, কিন্তু অ্যারেও অবজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। যেহেতু বেশিরভাগ বস্তুর একাধিক স্তরের উত্তরাধিকার থাকে তাই নিকটতম প্রোটোটাইপ সন্ধান করা আরও ভাল কৌশল। কিভাবে আমার উত্তর দেখুন।
মাইকম্যাকানা

4

গৃহীত উত্তরের উপর ভিত্তি করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে :

/**
 * Returns the name of an object's type.
 *
 * If the input is undefined, returns "Undefined".
 * If the input is null, returns "Null".
 * If the input is a boolean, returns "Boolean".
 * If the input is a number, returns "Number".
 * If the input is a string, returns "String".
 * If the input is a named function or a class constructor, returns "Function".
 * If the input is an anonymous function, returns "AnonymousFunction".
 * If the input is an arrow function, returns "ArrowFunction".
 * If the input is a class instance, returns "Object".
 *
 * @param {Object} object an object
 * @return {String} the name of the object's class
 * @see <a href="https://stackoverflow.com/a/332429/14731">https://stackoverflow.com/a/332429/14731</a>
 * @see getFunctionName
 * @see getObjectClass 
 */
function getTypeName(object)
{
  const objectToString = Object.prototype.toString.call(object).slice(8, -1);
  if (objectToString === "Function")
  {
    const instanceToString = object.toString();
    if (instanceToString.indexOf(" => ") != -1)
      return "ArrowFunction";
    const getFunctionName = /^function ([^(]+)\(/;
    const match = instanceToString.match(getFunctionName);
    if (match === null)
      return "AnonymousFunction";
    return "Function";
  }
  // Built-in types (e.g. String) or class instances
  return objectToString;
};

/**
 * Returns the name of a function.
 *
 * If the input is an anonymous function, returns "".
 * If the input is an arrow function, returns "=>".
 *
 * @param {Function} fn a function
 * @return {String} the name of the function
 * @throws {TypeError} if {@code fn} is not a function
 * @see getTypeName
 */
function getFunctionName(fn)
{
  try
  {
    const instanceToString = fn.toString();
    if (instanceToString.indexOf(" => ") != -1)
      return "=>";
    const getFunctionName = /^function ([^(]+)\(/;
    const match = instanceToString.match(getFunctionName);
    if (match === null)
    {
      const objectToString = Object.prototype.toString.call(fn).slice(8, -1);
      if (objectToString === "Function")
        return "";
      throw TypeError("object must be a Function.\n" +
        "Actual: " + getTypeName(fn));
    }
    return match[1];
  }
  catch (e)
  {
    throw TypeError("object must be a Function.\n" +
      "Actual: " + getTypeName(fn));
  }
};

/**
 * @param {Object} object an object
 * @return {String} the name of the object's class
 * @throws {TypeError} if {@code object} is not an Object
 * @see getTypeName
 */
function getObjectClass(object)
{
  const getFunctionName = /^function ([^(]+)\(/;
  const result = object.constructor.toString().match(getFunctionName)[1];
  if (result === "Function")
  {
    throw TypeError("object must be an Object.\n" +
      "Actual: " + getTypeName(object));
  }
  return result;
};


function UserFunction()
{
}

function UserClass()
{
}

let anonymousFunction = function()
{
};

let arrowFunction = i => i + 1;

console.log("getTypeName(undefined): " + getTypeName(undefined));
console.log("getTypeName(null): " + getTypeName(null));
console.log("getTypeName(true): " + getTypeName(true));
console.log("getTypeName(5): " + getTypeName(5));
console.log("getTypeName(\"text\"): " + getTypeName("text"));
console.log("getTypeName(userFunction): " + getTypeName(UserFunction));
console.log("getFunctionName(userFunction): " + getFunctionName(UserFunction));
console.log("getTypeName(anonymousFunction): " + getTypeName(anonymousFunction));
console.log("getFunctionName(anonymousFunction): " + getFunctionName(anonymousFunction));
console.log("getTypeName(arrowFunction): " + getTypeName(arrowFunction));
console.log("getFunctionName(arrowFunction): " + getFunctionName(arrowFunction));
//console.log("getFunctionName(userClass): " + getFunctionName(new UserClass()));
console.log("getTypeName(userClass): " + getTypeName(new UserClass()));
console.log("getObjectClass(userClass): " + getObjectClass(new UserClass()));
//console.log("getObjectClass(userFunction): " + getObjectClass(UserFunction));
//console.log("getObjectClass(userFunction): " + getObjectClass(anonymousFunction));
//console.log("getObjectClass(arrowFunction): " + getObjectClass(arrowFunction));
console.log("getTypeName(nativeObject): " + getTypeName(navigator.mediaDevices.getUserMedia));
console.log("getFunctionName(nativeObject): " + getFunctionName(navigator.mediaDevices.getUserMedia));

আমরা কেবল তখনই নির্মাণকারীর সম্পত্তি ব্যবহার করি যখন আমাদের অন্য কোনও পছন্দ নেই।


3

কোনও বস্তু নির্দিষ্ট শ্রেণীর উদাহরণ কিনা তা নির্ধারণ করতে আপনি "ইনসেন্টফ" অপারেটরটি ব্যবহার করতে পারেন। যদি আপনি কোনও সামগ্রীর প্রকারের নামটি না জানেন তবে আপনি এর নির্মাণকারীর সম্পত্তিটি ব্যবহার করতে পারেন। অবজেক্টের কনস্ট্রাক্টর প্রপার্টি, সেই ফাংশনের একটি রেফারেন্স যা তাদের আরম্ভ করতে ব্যবহৃত হয়। উদাহরণ:

function Circle (x,y,radius) {
    this._x = x;
    this._y = y;
    this._radius = raduius;
}
var c1 = new Circle(10,20,5);

এখন c1.constructor Circle()ফাংশন একটি রেফারেন্স । আপনি অপারেটরটি ব্যবহার করতে পারেন typeof, তবে typeofঅপারেটর সীমিত তথ্য দেখায়। একটি সমাধান হ'ল toString()অবজেক্ট গ্লোবাল অবজেক্টের পদ্ধতিটি ব্যবহার করা । উদাহরণস্বরূপ আপনার যদি কোনও অবজেক্ট থাকে তবে মাইওবজেক্ট বলুন, আপনি toString()মায়োবজেক্টের শ্রেণীর ধরণ নির্ধারণ করতে গ্লোবাল অবজেক্টের পদ্ধতিটি ব্যবহার করতে পারেন । এটা ব্যবহার কর:

Object.prototype.toString.apply(myObject);

3

বলুন তো আছে var obj;

আপনি যদি কেবল "অবজেক্ট", "অ্যারে" বা "স্ট্রিং" এর মতো আপজের ধরণের নাম চান তবে আপনি এটি ব্যবহার করতে পারেন:

Object.prototype.toString.call(obj).split(' ')[1].replace(']', '');

2

আপনি যে নিকটতম পেতে পারেন তা হ'ল typeofতবে এটি যে কোনও ধরণের কাস্টম ধরণের জন্য কেবল "অবজেক্ট" দেয় returns তাদের জন্য, জেসন বুটিং দেখুন

সম্পাদনা করুন, জেসন কোনও কারণে তার পোস্ট মুছে ফেলেছে, সুতরাং কেবলমাত্র অবজেক্টের constructorসম্পত্তি ব্যবহার করুন ।


হ্যাঁ, দুঃখিত - আমি এটি মুছে ফেলেছি কারণ আমি বুঝতে পেরেছি যে উদাহরণগুলি () কাজ করার একটি ভাল উপায় ছিল, তবে আমি কেবল এটি মুছে ফেলেছি যাতে এটি একটি রেফারেন্স হিসাবে পরিবেশন করতে পারে।
জেসন বুটিং

2
নিখুঁত উত্তরগুলির চেয়ে কম এখনও কার্যকর হয়, যদি কেবল অন্যদের কাছে পরে প্রশ্নে আসা হয় কারণ তাদের একই সমস্যা রয়েছে। সুতরাং আপনার সত্যিই এগুলি মুছে ফেলা উচিত নয়। ভুল উত্তরের জন্য মুছে ফেলা সংরক্ষণ করুন।
sblundy

2
হ্যাঁ, আমি জানি - আপনি গায়কদের কাছে প্রচার করছেন, আমি অন্যকেও ঠিক একই কথা বলেছি। আমরা সত্য হতে জানি সেই জিনিসগুলি বেঁচে থাকা প্রায়শই দেখতে দেখতে শক্ত হয়। :)
জেসন কেনা

0

যদি কেউ এমন কোনও সমাধান খুঁজছেন যা jQuery এর সাথে কাজ করছে, তবে এখানে অ্যাডজাস্ট করা উইকি কোড (মূল বিরতি jQuery) রয়েছে।

Object.defineProperty(Object.prototype, "getClassName", {
    value: function() {
        var funcNameRegex = /function (.{1,})\(/;
        var results = (funcNameRegex).exec((this).constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
});

হ্যাঁ, jQuery একটি 'hasOwnProperty' চেক করতে ব্যর্থ হয়েছে এবং তাই গণনা করে getNameএবং পড়ে যায়।
নিকোডেমাস 13

0

লোড্যাশের অনেকগুলি আইডমেডড রয়েছে তাই আপনি যদি লোডাশ ব্যবহার করেন তবে এর মতো মিক্সিনটি কার্যকর হতে পারে:

  // Mixin for identifying a Javascript Object

  _.mixin({
      'identify' : function(object) {
        var output;
          var isMethods = ['isArguments', 'isArray', 'isArguments', 'isBoolean', 'isDate', 'isArguments', 
              'isElement', 'isError', 'isFunction', 'isNaN', 'isNull', 'isNumber', 
              'isPlainObject', 'isRegExp', 'isString', 'isTypedArray', 'isUndefined', 'isEmpty', 'isObject']

          this.each(isMethods, function (method) {
              if (this[method](object)) {
                output = method;
                return false;
              }
          }.bind(this));
      return output;
      }
  });

এটি লোডাশে "শনাক্তকরণ" নামে একটি পদ্ধতি যুক্ত করে যা নিম্নলিখিত হিসাবে কাজ করে:

console.log(_.identify('hello friend'));       // isString

প্লাঙ্কার: http://plnkr.co/edit/Zdr0KDtQt76Ul3KTEDSN


0

ঠিক আছে, লোকেরা আমি কয়েক বছর ধরে ধীরে ধীরে এই জন্য সমস্ত পদ্ধতি তৈরি করছি ol কৌশলটি হ'ল:

  1. ক্লাস তৈরির জন্য একটি ব্যবস্থা আছে।
  2. নেটিভ কন্সট্রাক্টর দ্বারা তৈরি / উত্পাদিত সমস্ত ব্যবহারকারীর তৈরি ক্লাস, আদিম এবং মানগুলি পরীক্ষা করার জন্য একটি ব্যবস্থা আছে Have
  3. উপরোক্ত কার্যকারিতাটি আপনার কোড / অ্যাপ্লিকেশন / লাইব্রেরি ইত্যাদির মাধ্যমে প্রবেশ করতে পারে যাতে ব্যবহারকারীর তৈরি ক্লাসগুলিকে নতুন করে প্রসারিত করার জন্য একটি ব্যবস্থা আছে ..

উদাহরণের জন্য (বা আমি কীভাবে সমস্যার সাথে মোকাবিলা করেছি তা দেখতে) গিথুব-এ নিম্নলিখিত কোডটি দেখুন: https://github.com/elycruz/sjljs/blob/master/src/sjl/sjl.js এবং অনুসন্ধান করুন:

classOf =, classOfIs =এবং এবং defineSubClass =(ব্যাকটিক্স ছাড়াই (`))।

আপনি দেখতে পাচ্ছেন classOfযে আমার কাছে ক্লাস / কনস্ট্রাক্টরদের টাইপ নামটি আদিম, ব্যবহারকারীর সংজ্ঞায়িত শ্রেণি, নেটিভ কনস্ট্রাক্টর, নুল, এনএএন ইত্যাদি ব্যবহার করে তৈরি করা মান কিনা তা নির্বিশেষে সর্বদা আমাকে বাধ্য করার জন্য আমার কিছু ব্যবস্থা আছে force প্রতিটি জাভাস্ক্রিপ্ট মানের জন্য আমি classOfফাংশন থেকে এটি অনন্য টাইপ নাম পাবেন । এছাড়াও আমি প্রকৃত নির্মাণকারীগুলিতে প্রবেশ করতে পারিsjl.classOfIs একটি মানের প্রকারের পাশাপাশি এটির নামটিও পাস করতে সক্ষম হতে পারি তা পরীক্ষা করতে পারি! উদাহরণস্বরূপ:

! `` // দীর্ঘ নাম স্পেস ক্ষমা করুন! কিছুক্ষণ তাদের ব্যবহার না করা পর্যন্ত আমি প্রভাব সম্পর্কে কোনও ধারণা পাইনি (তারা হাহা স্তন্যপান করে)

var SomeCustomClass = sjl.package.stdlib.Extendable.extend({
    constructor: function SomeCustomClass () {},
    // ...
}),

HelloIterator = sjl.ns.stdlib.Iterator.extend( 
    function HelloIterator () {}, 
    { /* ... methods here ... */ },
    { /* ... static props/methods here ... */ }
),

helloIt = new HelloIterator();

sjl.classOfIs(new SomeCustomClass(), SomeCustomClass) === true; // `true`
sjl.classOfIs(helloIt, HelloIterator) === true; // `true`

var someString = 'helloworld';

sjl.classOfIs(someString, String) === true; // `true`

sjl.classOfIs(99, Number) === true; // true

sjl.classOf(NaN) === 'NaN'; // true

sjl.classOf(new Map()) === 'Map';
sjl.classOf(new Set()) === 'Set';
sjl.classOfIs([1, 2, 4], Array) === true; // `true`

// etc..

// Also optionally the type you want to check against could be the type's name
sjl.classOfIs(['a', 'b', 'c'], 'Array') === true; // `true`!
sjl.classOfIs(helloIt, 'HelloIterator') === true; // `true`!

``

উপরে বর্ণিত সেটআপটি কীভাবে ব্যবহার করি সে সম্পর্কে আপনি যদি পড়তে আগ্রহী হন তবে রেপোটি একবার দেখুন: https://github.com/elycruz/sjljs

এছাড়াও বিষয়বস্তু সহ বই: - স্টোয়ান স্টেফানভের "জাভাস্ক্রিপ্ট প্যাটার্নস"। - "জাভাস্ক্রিপ্ট - সংজ্ঞায়িত গাইড।" ডেভিড ফ্লানাগান দ্বারা। - এবং আরও অনেক .. (অনুসন্ধান ওয়েব)।

এছাড়াও আপনি দ্রুত বৈশিষ্ট্য আমি এখানে কথা বলছি পরীক্ষা করতে পারেন: - http://sjljs.elycruz.com/0.5.18/tests/for-browser/ (এছাড়াও URL- এ 0.5.18 পথ GitHub থেকে উৎস হয়েছে সেখানে নোড_মডিউলগুলি এবং এই জাতীয় বিয়োগ করা হবে।

শুভ কোডিং!


0

মোটামুটি সরল!

  • জেএস-এ যেকোন প্রকারের পেতে আমার প্রিয় পদ্ধতি
function getType(entity){
    var x = Object.prototype.toString.call(entity)
    return x.split(" ")[1].split(']')[0].toLowerCase()
}
  • আমার পছন্দসই পদ্ধতিতে জেএস-এর যেকোন প্রকারের পরীক্ষা করতে
function checkType(entity, type){
    return getType(entity) === type
}

-1

ব্যবহার class.name। এটিও সাথে কাজ করে function.name

class TestA {}
console.log(TestA.name); // "TestA"

function TestB() {}
console.log(TestB.name); // "TestB"

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