一尘不染

如何在Javascript中以字符串形式获取类对象的名称?

javascript

假设我以如下方式实例化Java对象:

var myObj = new someObject();

现在,是否可以'myObj'从一种类方法中获取字符串形式的var对象的名称?


其他详细信息(已编辑):

我之所以想获取持有该对象引用的变量的名称,是因为我的new变量myObjDIV在页面上创建一个新的clickable
,需要调用一个函数myObj.someFunction()。在插入新对象时,DIV我需要知道持有对象引用的变量的名称。也许有更好的方法吗?


您是对的,对术语的混淆感到抱歉。

我之所以想获取持有该对象引用的变量的名称,是因为我的新myObj会在页面上创建一个新的可单击DIV,这需要调用函数myObj.someFunction()。当我插入新的DIV时,我需要知道持有对象引用的变量的名称。也许有更好的方法吗?


阅读 403

收藏
2020-05-01

共1个答案

一尘不染

Shog9是正确的,因为要用多个变量引用一个对象,所以问这个问题没有太大意义。如果您真的不太在意,而只想找到引用该对象的全局变量之一的名称,则可以执行以下操作:

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()
}
2020-05-01