2014-01-12 102 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)來找出它被調用的變量(如果有的話,該方法本身可能被分配給變量)。

我不建議這樣做。