दिलचस्प पोस्ट
कहां या वैकल्पिक विकल्प में उपनाम का उपयोग करना? सी बहुआयामी सरणी में सूचक पता मैं गतिशील रूप से मेनू आइटम कैसे बना सकता हूं? एचटीएमएल: आंतरिक एचटीएमएल का उपयोग कर तालिका खींचें psql: सर्वर से कनेक्ट नहीं हो सका: ऐसा कोई फ़ाइल या निर्देशिका (मैक ओएस एक्स) नहीं है हम "nsstring में कैसे लिख सकते हैं? आईडी को पूरे पृष्ठ में अद्वितीय होना चाहिए? PHP में एसोसिएटिव एरेज़ की इंटरपोलेशन (डबल उद्धृत स्ट्रिंग) अहस्ताक्षरित पूर्णांक अतिप्रवाह अच्छा अभ्यास का उपयोग कर रहा है? फ़ाइल अपलोड नियंत्रण का उपयोग करके एकाधिक फ़ाइलों को कैसे चुनना है? asp.net पहचान उपयोगकर्ता में लॉग इन की सभी भूमिकाएं प्राप्त करें क्या है? = ऑपरेटर का मतलब है? जावास्क्रिप्ट ऑब्जेक्ट के सभी गुणों के मूल्य कैसे प्राप्त करें (कुंजियों को जानने के बिना)? गिट मुझे पोस्ट-पुल मर्ज कमिट संदेश के लिए क्यों प्रेरित करती है? एक बाइनरी फ़ाइल की सामग्री की नकल

क्लास ऑब्जेक्ट का नाम जावास्क्रिप्ट में स्ट्रिंग के रूप में कैसे प्राप्त करें?

मान लें कि मैं इस तरह जावास्क्रिप्ट में किसी ऑब्जेक्ट को इन्स्तांत करता हूं:

var myObj = new someObject(); 

अब, क्या 'myObj' ऑब्जेक्ट का नाम 'myObj' भीतर से 'myObj' स्ट्रिंग के रूप में प्राप्त करना संभव है?


अतिरिक्त विवरण (संपादित):

कारण है कि मैं ऑब्जेक्ट के संदर्भ में चर के नाम को प्राप्त करना चाहूंगा, यह है कि मेरी नई myObj उस पृष्ठ पर एक नया क्लिक करने योग्य DIV myObj.someFunction() फ़ंक्शन myObj.someFunction() कॉल करने की आवश्यकता होगी। जैसा कि मैंने नया DIV सम्मिलित किया है, मुझे ऑब्जेक्ट के संदर्भ में व्हीलर रखने वाले नाम का पता होना चाहिए। क्या ऐसा करने का शायद एक बेहतर तरीका है?


आप सही हैं, शब्दावली में मिश्रण के लिए खेद है।

कारण है कि मैं ऑब्जेक्ट के संदर्भ में चर के नाम को प्राप्त करना चाहूंगा, यह है कि मेरी नई ओओबेज उस पृष्ठ पर एक नया क्लिक करने योग्य डीआईवी बनायेगा जिसको फ़ंक्शन myObj.SomeFunction () कॉल करने की आवश्यकता होगी। जैसा कि मैंने नया डीआईवी सम्मिलित किया है, मुझे ऑब्जेक्ट के संदर्भ में व्हीलर रखने वाले नाम का पता होना चाहिए। क्या ऐसा करने का शायद एक बेहतर तरीका है?

Solutions Collecting From Web of "क्लास ऑब्जेक्ट का नाम जावास्क्रिप्ट में स्ट्रिंग के रूप में कैसे प्राप्त करें?"

शोग 9 सही है कि यह पूछने के लिए इतना अधिक अर्थ नहीं करता है, क्योंकि किसी ऑब्जेक्ट को कई चर से संदर्भित किया जा सकता है। यदि आपको वास्तव में इसके बारे में परवाह नहीं है, और आप जो भी चाहते हैं, उस ऑब्जेक्ट को संदर्भित वैश्विक वैरिएबल का नाम ढूंढना है, तो आप निम्न हैक कर सकते हैं:

 function myClass() { this.myName = function () { // search through the global object for a name that resolves to this object for (var name in this.global) if (this.global[name] == this) return name } } // store the global object, which can be referred to as this at the top level, in a // property on our prototype, so we can refer to it in our object's methods myClass.prototype.global = this // create a global variable referring to an object var myVar = new myClass() myVar.myName() // returns "myVar" 

ध्यान दें कि यह एक बदसूरत हैक है, और इसका उपयोग उत्पादन कोड में नहीं किया जाना चाहिए। यदि एक ऑब्जेक्ट के संदर्भ में एक से अधिक चर है, तो आप यह नहीं बता सकते कि आपको कौन मिलेगा। यह केवल वैश्विक चर की खोज करेगा, इसलिए यदि कोई फ़ंक्शन किसी फ़ंक्शन के लिए स्थानीय है तो यह काम नहीं करेगा। सामान्य तौर पर, यदि आपको कुछ नाम देना है, तो आपको इसे बनाने के समय नाम से निर्माता को पास करना चाहिए।

संपादित करें : आपके स्पष्टीकरण का उत्तर देने के लिए, यदि आपको ईवेंट हैंडलर से कुछ का उल्लेख करने की आवश्यकता है, तो आपको इसे नाम से संदर्भित नहीं करना चाहिए, बल्कि इसके बजाय एक फ़ंक्शन जोड़ना चाहिए जो ऑब्जेक्ट को सीधे संदर्भित करता है यहाँ एक त्वरित उदाहरण है, जिसे मैंने ऊपर उठाया था, जो कुछ इसी तरह दिखता है, मुझे लगता है कि आप क्या करने की कोशिश कर रहे हैं:

 function myConstructor () { this.count = 0 this.clickme = function () { this.count += 1 alert(this.count) } var newDiv = document.createElement("div") var contents = document.createTextNode("Click me!") // This is the crucial part. We don't construct an onclick handler by creating a // string, but instead we pass in a function that does what we want. In order to // refer to the object, we can't use this directly (since that will refer to the // div when running event handler), but we create an anonymous function with an // argument and pass this in as that argument. newDiv.onclick = (function (obj) { return function () { obj.clickme() } })(this) newDiv.appendChild(contents) document.getElementById("frobnozzle").appendChild(newDiv) } window.onload = function () { var myVar = new myConstructor() } 

लघु उत्तर: नहीं, MyObj ऑब्जेक्ट का नाम नहीं है, यह ऑब्जेक्ट का संदर्भ रखते हुए एक वेरिएबल का नाम है – आप एक ही ऑब्जेक्ट के संदर्भ में रखते हुए अन्य वैरिएबल हो सकते हैं।

अब, यदि यह आपका प्रोग्राम है, तो आप नियम बनाते हैं: यदि आप यह कहना चाहते हैं कि किसी भी ऑब्जेक्ट को केवल एक चर, हमेशा से संदर्भित किया जाएगा, और आपके कोड में वह दृढ़तापूर्वक लागू करेगा, तो ऑब्जेक्ट पर ऑब्जेक्ट के साथ ही सेट करें चर का नाम

उसने कहा, मुझे संदेह है कि आप क्या पूछ रहे हैं वास्तव में वास्तव में आप क्या चाहते हैं। शायद थोड़ा और अधिक विस्तार में आपकी समस्या का वर्णन करें …?


पैदल चलने वालों: जावास्क्रिप्ट में कक्षाएं नहीं हैं I someObject एक कन्स्ट्रक्टर फ़ंक्शन है someObject किसी ऑब्जेक्ट के संदर्भ को देखते हुए, आप उस कंसल्टेंट के संदर्भ प्राप्त कर सकते हैं जो इसे कन्स्ट्रक्टर संपत्ति का उपयोग कर बनाया था।


आपके द्वारा प्रदान किए गए अतिरिक्त विवरणों के जवाब में

आप जिस उत्तर की तलाश में हैं वह यहां पा सकते हैं: जावास्क्रिप्ट कॉलबैक स्कोप (और कई अन्य सवालों के जवाब में एसओ – यह जेएस के लिए नए लोगों के लिए भ्रम का एक आम मुद्दा है)। आपको केवल ऑब्जेक्ट सदस्य को एक बंद में लपेटने की आवश्यकता है जो कॉन्टेक्ट ऑब्जेक्ट तक पहुंच को सुरक्षित रखता है।

आप इसे स्ट्रिंग का उपयोग करके कन्स्ट्रक्टर द्वारा परिवर्तित कर सकते हैं .toString () :

 function getObjectClass(obj){ if (typeof obj != "object" || obj === null) return false; else return /(\w+)\(/.exec(obj.constructor.toString())[1];} 

आप किसी फ़ंक्शन में इसका उपयोग करके अपना लक्ष्य प्राप्त करने में सक्षम हो सकते हैं, और फिर toString() साथ फ़ंक्शन के स्रोत की जांच कर सकते हैं:

 var whatsMyName; // Just do something with the whatsMyName variable, no matter what function func() {var v = whatsMyName;} // Now that we're using whatsMyName in a function, we could get the source code of the function as a string: var source = func.toString(); // Then extract the variable name from the function source: var result = /var v = (.[^;]*)/.exec(source); alert(result[1]); // Should alert 'whatsMyName'; 

यदि आप ब्रायन के उत्तर में फ़ंक्शन कन्स्ट्रक्टर का उपयोग नहीं करना चाहते हैं, तो आप इसके बजाय ऑब्जेक्ट .create () का उपयोग कर सकते हैं: –

 var myVar = { count: 0 } myVar.init = function(n) { this.count = n this.newDiv() } myVar.newDiv = function() { var newDiv = document.createElement("div") var contents = document.createTextNode("Click me!") var func = myVar.func(this) newDiv.addEventListener ? newDiv.addEventListener('click', func, false) : newDiv.attachEvent('onclick', func) newDiv.appendChild(contents) document.getElementsByTagName("body")[0].appendChild(newDiv) } myVar.func = function (thys) { return function() { thys.clickme() } } myVar.clickme = function () { this.count += 1 alert(this.count) } myVar.init(2) var myVar1 = Object.create(myVar) myVar1.init(55) var myVar2 = Object.create(myVar) myVar2.init(150) // etc 

अजीब तरह से, मैं ऊपर newDiv.onClick का उपयोग करने के लिए काम नहीं कर सका, लेकिन यह newDiv.addEventListener / newDiv.attachEvent के साथ काम करता है।

चूंकि Object.create नई है, डगलस क्रॉकरफ़र्ड से पुराने ब्राउज़र्स के लिए निम्न कोड शामिल हैं, जिसमें आईई 8 भी शामिल है।

 if (typeof Object.create !== 'function') { Object.create = function (o) { function F() {} F.prototype = o return new F() } } 

एक अधिक प्राथमिक स्थिति के रूप में यह अच्छा होगा यदि इसकी एक संपत्ति थी जो इसे संदर्भित ( heads या tails ) संदर्भित कर सकती थी, लेकिन दुर्भाग्य से यह केवल नए coinSide ऑब्जेक्ट के तात्पर्य को संदर्भित करता है

 javascript: /* it would be nice but ... a solution NOT! */ function coinSide(){this.ref=this}; /* can .ref be set so as to identify it's referring variable? (heads or tails) */ heads = new coinSide(); tails = new coinSide(); toss = Math.random()<0.5 ? heads : tails; alert(toss.ref); alert(["FF's Gecko engine shows:\n\ntoss.toSource() is ", toss.toSource()]) 

जो हमेशा दिखाता है

 [object Object] 

और फ़ायरफ़ॉक्स के गीको इंजन से पता चलता है:

 toss.toSource() is ,#1={ref:#1#} 

बेशक, इस उदाहरण में, #1 को हल करने के लिए, और इसलिए toss , यह toss==heads toss==tails और toss==tails परीक्षण करने के लिए काफी सरल है। यह प्रश्न, जो वास्तव में पूछ रहा है कि जावास्क्रिप्ट में call-by-name तंत्र है, समकक्ष के विचार को प्रेरित करता है, क्या एक चर का वास्तविक मूल्य निर्धारित करने के लिए call-by-value तंत्र है? उदाहरण दर्शाता है कि दोनों heads और tails के "मूल्य" समान हैं, फिर भी alert(heads==tails) false

आत्म-संदर्भ को निम्नानुसार दृढ़ किया जा सकता है:
(ऑब्जेक्ट स्पेस हंट और संभावित अस्पष्टता से बचने जैसा कि क्लास ऑब्जेक्ट के नाम को जावास्क्रिप्ट में स्ट्रिंग के रूप में प्राप्त करने के तरीके में बताया गया है? समाधान)

 javascript: function assign(n,v){ eval( n +"="+ v ); eval( n +".ref='"+ n +"'" ) } function coinSide(){}; assign("heads", "new coinSide()"); assign("tails", "new coinSide()"); toss = Math.random()<0.5 ? heads : tails; alert(toss.ref); 

heads या tails प्रदर्शित करने के लिए

यह संभवतः जावास्क्रिप्ट की भाषा डिजाइन के सार के लिए एक अभिशप्त है, जैसा कि एक प्राचीन प्रोटोटाइप फंक्शनल भाषा के रूप में है, जैसे कि प्राथमिकताओं के रूप में ऐसी क्षमताएं हैं।

एक अंतिम विचार:

  javascript: item=new Object(); refName="item"; deferAgain="refName"; alert([deferAgain,eval(deferAgain),eval(eval(deferAgain))].join('\n')); 

इसलिए, जैसा कि निर्धारित …

 javascript: function bindDIV(objName){ return eval( objName +'=new someObject("'+objName+'")' ) }; function someObject(objName){ this.div="\n<DIV onclick='window.opener."+ /* window.opener - hiccup!! */ objName+ ".someFunction()'>clickable DIV</DIV>\n"; this.someFunction=function(){alert(['my variable object name is ',objName])} }; with(window.open('','test').document){ /* see above hiccup */ write('<html>'+ bindDIV('DIVobj1').div+ bindDIV('DIV2').div+ (alias=bindDIV('multiply')).div+ 'an aliased DIV clone'+multiply.div+ '</html>'); close(); }; void (0); 

क्या कोई बेहतर तरीका है … ?

आसान के रूप में "बेहतर"? कार्यक्रम के लिए आसान है? समझने में आसान है? तेजी से निष्पादन के रूप में आसान है? या यह " … और अब पूरी तरह से कुछ अलग " के रूप में है?

ऑब्जेक्ट instantiatd के तुरंत बाद, आप एक संपत्ति संलग्न कर सकते हैं, name , ऑब्जेक्ट और स्ट्रिंग वैल्यू निर्दिष्ट कर सकते हैं जो आपको अपेक्षित है:

 var myObj = new someClass(); myObj.name="myObj"; document.write(myObj.name); 

वैकल्पिक रूप से, असाइनमेंट क्लास के कोड के अंदर किया जा सकता है, अर्थात

 var someClass = function(P) { this.name=P; // rest of the class definition... }; var myObj = new someClass("myObj"); document.write(myObj.name); 

कुछ समय पहले, मैंने इसका इस्तेमाल किया था।

शायद आप कोशिश कर सकते हैं:

 +function(){ var my_var = function get_this_name(){ alert("I " + this.init()); }; my_var.prototype.init = function(){ return my_var.name; } new my_var(); }(); 

एक चेतावनी पॉप करें : "I get_this_name"

यह बहुत पुराना है, लेकिन मैंने इस प्रश्न के माध्यम से Google के माध्यम से भाग लिया, इसलिए शायद यह समाधान दूसरों के लिए उपयोगी हो सकता है

 function GetObjectName(myObject){ var objectName=JSON.stringify(myObject).match(/"(.*?)"/)[1]; return objectName; } 

यह ब्राउज़र के JSON पार्सर और regex का उपयोग केवल DOM या आपके ऑब्जेक्ट को बहुत ज्यादा बिना क्लिटरिंग करता है