我希望能够从类中获取实例化类的实例的名称。
示例:
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 :(得分: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;
}
}
因为configurable
,enumerable
和writable
在您使用false
时都默认为Object.defineProperty()
。
或者,如果您不想在对象上使用可访问属性,可以通过执行以下操作将其设为私有:
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个单独的引用。没有规范变量。