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

IT技术 javascript class
2021-02-08 15:10:15

假设我像这样在 Javascript 中实例化一个对象:

var myObj = new someObject();

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


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

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


你是对的,抱歉术语混淆。

我想要获取对对象的引用的变量名称的原因是我的新 myObj 将在页面上创建一个新的可点击 DIV,该 DIV 需要调用函数 myObj.someFunction()。当我插入新的 DIV 时,我需要知道保存对象引用的变量的名称。也许有更好的方法来做到这一点?

6个回答

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"

请注意,这是一个丑陋的 hack,不应在生产代码中使用。如果引用一个对象的变量不止一个,你就分不清会得到哪一个。它只会搜索全局变量,因此如果变量是函数的局部变量,它将不起作用。一般来说,如果你需要命名一些东西,你应该在创建它时将名称传递给构造函数。

编辑:为了回应您的澄清,如果您需要能够从事件处理程序中引用某些内容,则不应按名称引用它,而是添加一个直接引用该对象的函数。这是我提出的一个快速示例,我认为它显示了与您正在尝试做的事情类似的事情:

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()
}
布赖恩,感谢您的补充意见。正如您在修改后的答案中指出的那样,我最终动态分配了 onclick 处理程序,而不是将其作为字符串传递给 div 的 onclick 属性。
2021-03-31 15:10:15
将变量的名称传递给构造函数是到目前为止我一直在做的事情,尽管想知道是否有不同的方式来实现同样的事情。
2021-04-09 15:10:15

简短回答:不。 my​​Obj 不是对象的名称,它是保存对象引用的变量的名称 - 您可以有任意数量的其他变量保存对同一对象的引用。

现在,如果它是你的程序,那么你制定规则:如果你想说任何给定的对象只会被一个变量引用,永远,并在你的代码中努力地强制执行,那么只需在对象上设置一个属性变量的名称。

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


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


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

您可以在此处找到您正在寻找的答案:JavaScript Callback Scope(以及对关于 SO 的许多其他问题的回答 - 对于那些不熟悉 JS 的人来说,这是一个常见的困惑点)。您只需要将对象成员的调用包装在一个保留对上下文对象的访问的闭包中。

不是迂腐,这是理解的关键。
2021-03-15 15:10:15

您可以使用.toString()将构造函数转换为字符串

function getObjectClass(obj){
   if (typeof obj != "object" || obj === null) return false;
   else return /(\w+)\(/.exec(obj.constructor.toString())[1];}
还: obj.constructor.name
2021-03-27 15:10:15
我相信 OP 要求的是变量的名称,而不是构造函数的名称。
2021-04-09 15:10:15

您可以通过在函数中使用它来实现您的目标,然后使用以下命令检查函数的源代码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 是新的,因此为旧浏览器(包括 IE8)包含以下来自 Douglas Crockford 的代码。

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