for - javascript pdf



একটি বস্তুর টাইপ নাম পান (12)

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

না

ES2015 আপডেট : class Foo {} নাম Foo.namething ধরন নির্বিশেষে 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 এবং আই 7 এ পরীক্ষা করেছি, আমি অন্য বাস্তবায়নের জন্য কথা বলতে পারি না।

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

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

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

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

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

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

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

আদেশ সহকারে

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

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

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

new Thingy মাধ্যমে নির্মিত Objects একটি constructor সম্পত্তি থাকবে যা Thingy নির্দেশ করে, 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 তার prototype হিসাবে সেট থাকে তবে আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। এই আলোচনার সুযোগ বাইরে এই উপায় আছে।

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

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

টাইপ পরীক্ষণের জন্য .constructor ব্যবহার করে আপনি বিভিন্ন window অবজেক্ট থেকে আসছে এমন বস্তুর ধরন পরীক্ষা করতে চাইলে, আইফ্রেম বা একটি পপআপ উইন্ডো বলবেন। এটি প্রতিটি 'উইন্ডো', অর্থাৎ প্রতিটি কোর টাইপ constructor এর একটি ভিন্ন সংস্করণ আছে

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

অপারেটর এর instanceof ব্যবহার করে ...

instanceof অপারেটরটি object ধরণটি পরীক্ষা করার একটি পরিষ্কার 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

instanceof , instanceof কাজ করার জন্য Object একটি Object মধ্যে আবৃত করা দরকার

new Number(3) instanceof Number // true

.constructor চেক .constructor জন্য সূক্ষ্ম কাজ কারণ . পদ্ধতি আহরণ implicitly তাদের নিজ নিজ বস্তুর টাইপ মধ্যে আক্ষরিক wraps

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

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

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

instanceof , constructor সম্পত্তি চেক হিসাবে একই কারণে বিভিন্ন উইন্ডোতে কাজ করবে না।

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

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

আবার, উপরে দেখুন; নির্মাতা সম্পূর্ণরূপে এবং সম্পূর্ণরূপে ভুল এবং নিরর্থক হতে এটা বেশ সাধারণ।

<IE9 কাজ করে না

myObjectInstance.constructor.name ব্যবহার করে আপনাকে একটি স্ট্রিং ব্যবহার করা হবে যা constructor ফাংশন ব্যবহার করা হয়েছে, তবে এটি পূর্বে উল্লেখিত constructor সম্পত্তি সম্পর্কে myObjectInstance.constructor.name সাপেক্ষে।

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

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

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

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

cruft অপসারণ এবং শুধু টাইপ নাম পেতে

type('abc') // String

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

সব জন্য caveats ...

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

// 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

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

বিঃদ্রঃ:

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

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


Answer #1

হালনাগাদ

সুনির্দিষ্ট হতে, আমি মনে করি OP একটি ফাংশন চাওয়া যা একটি নির্দিষ্ট বস্তুর জন্য কন্সট্রাকটর নাম পুনরুদ্ধার করে। জাভাস্ক্রিপ্টের পরিপ্রেক্ষিতে, 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

Answer #2

আপনি পেতে সবচেয়ে কাছের টাইপ, কিন্তু এটি শুধুমাত্র কোনও প্রকারের কাস্টম প্রকারের জন্য "বস্তু" প্রদান করে। তাদের জন্য, জেসন Bunting দেখুন

সম্পাদনা, জেসন কিছু কারণে তার পোস্ট মুছে ফেলা হয়েছে, তাই শুধু অবজেক্ট এর constructor সম্পত্তি ব্যবহার করুন।


Answer #3

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


Answer #4

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

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

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

Answer #5

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

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

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


Answer #6

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

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

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

Object.prototype.toString.apply(myObject);

Answer #7

জেসন Bunting এর উত্তর আমাকে প্রয়োজনীয় কি খুঁজতে একটি সুতা যথেষ্ট দিয়েছেন:

<<Object instance>>.constructor.name

সুতরাং, উদাহরণস্বরূপ, কোডের নিচের অংশে:

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

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


Answer #8

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

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

Answer #9

যে কেউ 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] : "";
    }
});

Answer #10

Agave.JS থেকে ধরনের () ফাংশন ফিরে আসবে:

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

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

নাম্বার

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'

Answer #11

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]).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




javascript