我希望能夠從類中獲取實例分配給的變量的名稱。
這不是在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;
}
}
因爲configurable
,enumerable
和writable
所有當您使用時,默認爲。
或者,如果你想在對象上不使用訪問屬性,你可以把私人的這樣做:
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點獨立的引用。沒有規範變量。
「inst」是變量名稱,不是類型。 – doublesharp
如果您創建了一個實例'var x = new X()'然後將該實例賦值給一個新變量'var y = x',getInInstanceName會怎樣? x和y都指向相同的對象 – Punit
如果您匿名使用該對象,該怎麼辦? 'new MyClass()。getInstanceName()' – 4castle