如何在Javascript中获取类对象的名称作为string?

比方说,我像这样在Javascript中实例化一个对象:

var myObj = new someObject(); 

现在,是否有可能从一个类的方法中获取var对象的名称作为string'myObj'


更多细节(编辑):

之所以我想获得variables的引用对象的名称,是因为我的新的myObj将在页面上创build一个新的可点击的DIV ,需要调用一个函数myObj.someFunction() 。 当我插入新的DIV我需要知道引用该对象的variables的名称。 有没有更好的方法来做到这一点?


你说得对,对于混淆的术语抱歉。

之所以我想获得variables的引用对象的名称,是因为我的新的myObj将在页面上创build一个新的可点击的DIV,需要调用一个函数myObj.someFunction()。 当我插入新的DIV时,我需要知道引用该对象的variables的名称。 有没有更好的方法来做到这一点?

Shog9是正确的,这并没有太多的意义要问,因为一个对象可以被多个variables引用。 如果你真的不关心这一点,而你只想find一个引用该对象的全局variables的名字,你可以做以下的攻击:

 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" 

请注意,这是一个丑陋的黑客,不应该在生产代码中使用。 如果有多个variables指向一个对象,那么你就不能分辨出哪一个会得到。 它只会search全局variables,所以如果一个variables是一个函数本地的话,它将不起作用。 一般来说,如果你需要命名一些东西,你应该在创build它的时候把名字传给构造函数。

编辑 :为了响应你的说明,如果你需要能够引用事件处理程序中的某些东西,你不应该通过名字来引用它,而是直接添加一个引用该对象的函数。 下面是一个简单的例子,我掀起了一个类似的事情,我想,这与你想要做的事情是一样的:

 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不是对象的名称,它是一个variables的名称,它持有对该对象的引用 – 可以有任意数量的其他variables持有对同一对象的引用。

现在,如果它是你的程序,那么你就制定了规则:如果你想要说任何给定的对象只会被一个variables引用,并且在你的代码中勤奋的执行,那么只需在对象上设置一个属性variables的名称。

这就是说,我怀疑你所要求的其实是你真正想要的。 也许更详细地描述你的问题…?


Pedantry: JavaScript没有类。 someObject是一个构造函数。 给定一个对象的引用,可以使用构造函数属性获得对创build它的函数的引用。


针对您提供的其他详细信息:

你正在寻找的答案可以在这里find: JavaScript的callback范围 (以及对于许多其他问题的回应 – 这是对新的JS的一个共同点混淆)。 您只需要将对对象成员的调用封装在保留访问上下文对象的闭包中。

您可以使用.toString()将其通过构造函数转换为string:

 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'; 

如果你不想在Brian的答案中使用函数构造函数,你可以使用Object.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是新鲜的,因此包括道格拉斯·克罗克福德(Douglas Crockford)在内的旧版浏览器的代码,包括IE8。

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

作为一个更基本的情况,这将是很好的,如果this有一个属性,可以引用它的variables( headstails ),但不幸的是,它只引用新的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] 

和Firefox的Gecko引擎显示:

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

当然,在这个例子中,为了解决#1 ,因此toss ,它足够简单地testingtoss==headstoss==tails 。 这个问题实际上是在询问javascript是否具有call-by-name机制,是否激发了对方的考虑,是否有call-by-value机制来确定variables的实际值? 这个例子表明headstails的“值”是相同的,但是alert(heads==tails)false

自我引用可以被强制如下:
(避免对象空间狩猎和可能的歧义,如在JavaScript中解决方法中的如何获取类对象的名称作为一个string )

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

显示headstails

对于Javascript的语言devise本质来说,这也许是一种讽刺,作为一种解释的原型function语言,具有原始的function。

最后的考虑:

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

有没有更好的办法 … ?

“越好”越容易? 更容易编程? 更容易理解? 更快的执行更容易? 还是像“ …现在完全不同 ”?

在对象实例化之后,立即可以将一个属性(比如name附加到该对象,并为其指定string值:

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

另外,分配可以在class级的代码内进行,即

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

popup一个提醒"I get_this_name"

这是相当古老,但我通过谷歌跑过这个问题,所以也许这个解决scheme可能对其他人有用。

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

它只是使用浏览器的JSONparsing器和正则expression式,而不会混淆DOM或对象太多。