2016-12-11 94 views
-2

我希望能夠從類中獲取實例化類的實例的名稱。Javascript ES6 - 從類中獲取實例的名稱

例子:

class MyClass { 
    getInstanceName() { 
     // code that figures out the name given to the instance 
     // instantiating this class 
    } 
} 

var inst = new MyClass(); 
console.log(inst.getInstanceName()); // should log "inst" 

我希望得到這個從實例名稱在類中發出的事件。我在node.js中執行此操作

+0

「inst」是變量名稱,不是類型。 – doublesharp

+0

如果您創建了一個實例'var x = new X()'然後將該實例賦值給一個新變量'var y = x',getInInstanceName會怎樣? x和y都指向相同的對象 – Punit

+0

如果您匿名使用該對象,該怎麼辦? 'new MyClass()。getInstanceName()' – 4castle

回答

6

我希望能夠從類中獲取實例分配給的變量的名稱。

這不是在Javascript中可能的東西。

一個對象可以分配給數百個變量。只有語言實現的內部(垃圾收集器使用的這種信息)知道哪些變量包含對給定對象的引用。這不是該語言用戶可以獲得的信息。

如果在你的情況下,你想要一個對象來存儲這樣的信息,你必須把名字傳遞給構造函數。然後,對象的構造函數可以保存稍後調用getInstanceName()方法時提供的字符串。無法自動執行此操作。

下面是存儲名稱的構造函數的一個簡單實現。

var inst = new MyClass("inst"); 

class MyClass { 
    constructor(name) { 
     this._name = name; 
    } 
    getInstanceName() { 
     return this._name; 
    } 
} 

或者,無法設定的,不可枚舉的屬性:

class MyClass { 
    constructor(name) { 
     Object.defineProperty(this, "_name", { 
      configurable: false, 
      enumerable: false, 
      value: name, 
      writable: false 
     }); 
    } 
    getInstanceName() { 
     return this._name; 
    } 
} 

這可能是縮短到這一點:

class MyClass { 
    constructor(name) { 
     Object.defineProperty(this, "_name", {value: name}); 
    } 
    getInstanceName() { 
     return this._name; 
    } 
} 

因爲configurableenumerablewritable所有當您使用時,默認爲。


或者,如果你想在對象上不使用訪問屬性,你可以把私人的這樣做:

const MyClass = (function() { 
    // keep track of names in a private space 
    const names = new WeakMap(); 


    class MyClass { 
     constructor(name) { 
      names.set(this, name); 
     } 
     getInstanceName() { 
      return names.get(this); 
     } 
    } 
    return MyClass; 
})(); 

var inst = new MyClass("inst"); 

由於含有相同的多個變量的一個例子,看看在這裏:

var x, y, z; 
x = y = z = new MyClass(); 

現在,你有三個單獨的變量,所有的引用同一個對象。所以,即使語言想要做你所問(它不),也沒有包含對給定對象的引用的規範變量。

或者,這樣的:

function doSomething(obj) { 
    var t = obj; 
    // at this point, there are 5 separate variables with a reference to your object 
} 

var x, y, z; 
x = y = z = new MyClass(); 

doSomething(x); 

其中有同一對象的5點獨立的引用。沒有規範變量。