2014-01-12 69 views
2

这里就是我想:在类中获取一个类的实例的名称

var Validator = function() { 
    this.do = function() { 
     alert(INTANCENAME); /// SHOULD BE 'FOO' 
    } 
} 
var FOO = new Validator().do(); 

是否possibe在Javascript执行?

+0

你为什么需要它? – zerkms

+0

那不是首先击败了物体的对象吗? – BenM

+4

我不认为'FOO'是实例的名称,而不是实例当前存储的变量的名称。 –

回答

2

事实是没有这样做的时候,我也很难想到的唯一办法是进行循环,全部window或范围的对象和检查某种平等与当前对象,像

this.do = function() { 
    for(var key in window) { 
     if(this === window[key]) { 
      alert(key); 
     } 
    } 
}; 

为了在分配之后进行调用。

var FOO = new Validator(); 
FOO.do(); 

,可以拿出另一个问题是,一个实例(参照)可以存储在各种变量,所以也许不会得到你所期望的。

+0

这工作,这里有一个替代,但类似的解决方案http://stackoverflow.com/questions/2462199/javascript-list-global-variables-in-ie/2462341#2462341 –

1

没有办法直接做你在这里要求的东西。对象本身并不是由它们的匹配变量名定义的 - 实际上,可能存在不直接分配给变量的对象,并将多个变量分配给同一对象。

JavaScript解释器使用我们的变量名作为标识符来帮助代码执行,但一旦运行,变量名对运行的JavaScript程序没有什么区别,因为它可能在执行时被缩减为内存引用,与您编写的原始代码完全分离。

编辑:回答yannis确实有点模拟这个,但它依赖于在特定范围内可用的变量 - 我的观点是没有直接的方式来从对象本身做到这一点,根据你的例子这个问题。

1

字面回答你的问题是:

  1. 使用(new Error()).stack获得上线,并在do()方法被调用的功能的信息。
  2. 使用JS解析器(例如Esprima)来找出它被调用的变量(如果有的话,该方法本身可能被分配给变量)。

我不建议这样做。