সেখানে একটি হল জাভাস্ক্রিপ্ট সমতুল্য জাভা এর class.getName()
?
সেখানে একটি হল জাভাস্ক্রিপ্ট সমতুল্য জাভা এর class.getName()
?
উত্তর:
জাভা স্ক্রিপ্ট সমান জাভা আছে
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? কারণ জাভাস্ক্রিপ্ট প্রথম বিন্দুকে দশমিক পয়েন্ট হিসাবে ব্যাখ্যা করে;)
instanceof
constructor
সম্পত্তি চেক হিসাবে একই কারণে বিভিন্ন উইন্ডো জুড়েও কাজ করবে না ।
name
সম্পত্তির সম্পত্তি ব্যবহার করে constructor
...আবার উপরে দেখুন; constructor
পুরোপুরি এবং সম্পূর্ণরূপে ভুল এবং অকেজো হওয়া এটি বেশ সাধারণ ।
ব্যবহার 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
দরকারী তা বোঝা গুরুত্বপূর্ণ, তবে বর্তমানে আমি মনে করি না যে এটি এই আলোচনার সাথে মারাত্মকভাবে প্রাসঙ্গিক। আমার মন যদিও পরিবর্তনের জন্য উন্মুক্ত। :)
constructor
পদ্ধতির (যেগুলি দিয়ে .toString()
বা হয় .name
) পরীক্ষা করে এমন কোনও কৌশল কাজ করতে ব্যর্থ হবে। সংক্ষিপ্তকরণটি কনস্ট্রাক্টরের নাম পরিবর্তন করে, তাই আপনার মতো ভুল শ্রেণীর নাম শেষ হবে n
। আপনি যদি এই দৃশ্যে থাকেন তবে আপনি নিজের বস্তুর উপর কোনও সম্পত্তি নিজেই সংজ্ঞায়িত করতে পারেন className
এবং তার পরিবর্তে এটি ব্যবহার করতে পারেন।
জেসন বুটিংয়ের উত্তর আমাকে যা প্রয়োজন তা সন্ধান করার জন্য যথেষ্ট পরিমাণে একটি ক্লু দিয়েছে:
<<Object instance>>.constructor.name
সুতরাং, উদাহরণস্বরূপ, নিম্নলিখিত কোডের টুকরাটিতে:
function MyObject() {}
var myInstance = new MyObject();
myInstance.constructor.name
ফিরে আসবে "MyObject"
।
function getType(o) { return o && o.constructor && o.constructor.name }
আমি একটি ছোট কৌশল ব্যবহার করি:
function Square(){
this.className = "Square";
this.corners = 4;
}
var MySquare = new Square();
console.log(MySquare.className); // "Square"
class Square
তবে নামটি Square.name
/ MySquare.constructor.name
পরিবর্তে Square.prototype.name
; name
কনস্ট্রাক্টর ফাংশনটি রেখে এটি প্রোটোটাইপ বা কোনও উদাহরণকে দূষিত করে না, তবে তা উভয় থেকেই অ্যাক্সেসযোগ্য।
সুনির্দিষ্টভাবে বলতে গেলে, আমি মনে করি ওপি একটি নির্দিষ্ট ফাংশনের জন্য কনস্ট্রাক্টরের নাম পুনরুদ্ধার করে এমন একটি ফাংশন চেয়েছিল। জাভাস্ক্রিপ্টের নিরিখে, 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
test.getClassName()
বনাম getClassName.apply(test)
।
অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং ব্যবহার করা
দেখা যাচ্ছে যে এই পোস্টের বিবরণ হিসাবে, আপনি অবজেক্ট.প্রোটোটাইপ.টো স্ট্রিং ব্যবহার করতে পারেন - টোস্ট্রিংয়ের নিম্ন স্তরের এবং জেনেরিক প্রয়োগ - সমস্ত অন্তর্নির্মিত ধরণের জন্য টাইপ পেতে
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
.slice()
:Object.prototype.toString.call(obj).slice( 8, -1 );
এখানে এমন একটি সমাধান রয়েছে যা আমি হাজির করেছি যা উদাহরণগুলির ত্রুটিগুলি সমাধান করে। এটি ক্রস-উইন্ডোজ এবং ক্রস-ফ্রেমগুলি থেকে কোনও সামগ্রীর প্রকারগুলি পরীক্ষা করতে পারে এবং আদিম ধরণের সমস্যা নেই।
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 সমস্ত কন্ট্রাক্টরকে কন্ট্রাক্টর সরবরাহ করে না তাই নোডলিস্টের জন্য উপরের পরীক্ষাটি মিথ্যা ফিরে আসবে এবং একটি আইসনস্ট্যান্স (সতর্কতা, "ফাংশন") মিথ্যা ফিরে আসবে।
আমি আসলে একটি অনুরূপ জিনিস খুঁজছিলাম এবং এই প্রশ্ন জুড়ে এসেছিল। এখানে আমি কীভাবে প্রকারগুলি পাই : 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);
}
আপনার 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'
আগাভ.জেএস এর ধরণের () ফাংশনটি ফিরে আসবে:
এটি সমস্ত জেএস বস্তু এবং আদিমদের উপর কাজ করে, সেগুলি কীভাবে তৈরি করা হয়েছিল তা নির্বিশেষে এবং এতে কোনও আশ্চর্য হওয়ার দরকার নেই। উদাহরণ:
kind(37) === 'Number'
kind(3.14) === 'Number'
kind(Math.LN2) === 'Number'
kind(Infinity) === 'Number'
kind(Number(1)) === 'Number'
kind(new Number(1)) === 'Number'
kind(NaN) === 'NaN'
kind('') === 'String'
kind('bla') === 'String'
kind(String("abc")) === 'String'
kind(new String("abc")) === 'String'
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'
আপনি instanceof
অপারেটরটি দেখতে কোনও বস্তুর অন্যের উদাহরণ কিনা তা দেখতে ব্যবহার করতে পারেন , তবে যেহেতু কোনও ক্লাস নেই তাই আপনি কোনও শ্রেণীর নাম পেতে পারেন না।
instanceof
কেবল কোনও বস্তু অন্য বস্তুর উত্তরাধিকার সূত্রে পরীক্ষা করে। উদাহরণস্বরূপ, []
অ্যারে থেকে একটি সাধারণ উত্তরাধিকারসূত্রে, কিন্তু অ্যারেও অবজেক্ট থেকে উত্তরাধিকার সূত্রে প্রাপ্ত। যেহেতু বেশিরভাগ বস্তুর একাধিক স্তরের উত্তরাধিকার থাকে তাই নিকটতম প্রোটোটাইপ সন্ধান করা আরও ভাল কৌশল। কিভাবে আমার উত্তর দেখুন।
গৃহীত উত্তরের উপর ভিত্তি করে একটি বাস্তবায়ন এখানে দেওয়া হয়েছে :
/**
* 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));
আমরা কেবল তখনই নির্মাণকারীর সম্পত্তি ব্যবহার করি যখন আমাদের অন্য কোনও পছন্দ নেই।
কোনও বস্তু নির্দিষ্ট শ্রেণীর উদাহরণ কিনা তা নির্ধারণ করতে আপনি "ইনসেন্টফ" অপারেটরটি ব্যবহার করতে পারেন। যদি আপনি কোনও সামগ্রীর প্রকারের নামটি না জানেন তবে আপনি এর নির্মাণকারীর সম্পত্তিটি ব্যবহার করতে পারেন। অবজেক্টের কনস্ট্রাক্টর প্রপার্টি, সেই ফাংশনের একটি রেফারেন্স যা তাদের আরম্ভ করতে ব্যবহৃত হয়। উদাহরণ:
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);
বলুন তো আছে var obj;
আপনি যদি কেবল "অবজেক্ট", "অ্যারে" বা "স্ট্রিং" এর মতো আপজের ধরণের নাম চান তবে আপনি এটি ব্যবহার করতে পারেন:
Object.prototype.toString.call(obj).split(' ')[1].replace(']', '');
আপনি যে নিকটতম পেতে পারেন তা হ'ল typeof
তবে এটি যে কোনও ধরণের কাস্টম ধরণের জন্য কেবল "অবজেক্ট" দেয় returns তাদের জন্য, জেসন বুটিং দেখুন ।
সম্পাদনা করুন, জেসন কোনও কারণে তার পোস্ট মুছে ফেলেছে, সুতরাং কেবলমাত্র অবজেক্টের constructor
সম্পত্তি ব্যবহার করুন ।
যদি কেউ এমন কোনও সমাধান খুঁজছেন যা 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] : "";
}
});
getName
এবং পড়ে যায়।
লোড্যাশের অনেকগুলি আইডমেডড রয়েছে তাই আপনি যদি লোডাশ ব্যবহার করেন তবে এর মতো মিক্সিনটি কার্যকর হতে পারে:
// 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
ঠিক আছে, লোকেরা আমি কয়েক বছর ধরে ধীরে ধীরে এই জন্য সমস্ত পদ্ধতি তৈরি করছি ol কৌশলটি হ'ল:
উদাহরণের জন্য (বা আমি কীভাবে সমস্যার সাথে মোকাবিলা করেছি তা দেখতে) গিথুব-এ নিম্নলিখিত কোডটি দেখুন: 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 থেকে উৎস হয়েছে সেখানে নোড_মডিউলগুলি এবং এই জাতীয় বিয়োগ করা হবে।
শুভ কোডিং!
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
}
ব্যবহার class.name
। এটিও সাথে কাজ করে function.name
।
class TestA {}
console.log(TestA.name); // "TestA"
function TestB() {}
console.log(TestB.name); // "TestB"
class
এবং উদাহরণ নয়।