2016-12-11 118 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点独立的引用。没有规范变量。