Javascript ES6 - 从类中获取实例的名称

时间:2016-12-11 05:03:06

标签: javascript node.js es6-class

我希望能够从类中获取实例化类的实例的名称。

示例:

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

中这样做

1 个答案:

答案 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;
    }
}

因为configurableenumerablewritable在您使用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个单独的引用。没有规范变量。