我希望能够从类中获取实例分配给的变量的名称。
这不是在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