3

这个问题确实很简单,但我无法google或duckduckgo答案,可能是因为99%的初学者教程都涉及创建具有属性的Person对象name(与constructor.name无关,但会污染搜索结果)。

Object可以使用 instance.constructor.name 检测对象的实例:

var foo = new Object;
foo.constructor.name; // "Object"

如何在我自己的对象上设置构造函数名称?

var Bar = function(){};
var baz = new Bar;
baz.constructor.name // "" <- Empty string
4

3 回答 3

10

除了将构造函数定义Bar为设置为匿名函数的变量之外,您还可以执行以下操作:

function Bar() {}

或这个:

var Bar = function ConstructorNameHere() {};

ConstructorNameHere名称实际上可以Bar再次出现的地方:

var Bar = function Bar() {};

(这应该可以在 Chrome 和 FF 中使用,不确定但对 IE 不是很有希望。)

于 2013-06-18T12:54:51.250 回答
3

重要警告:

如果您使用 JS 缩小器,那么名称可能会被优化掉,并突然constructor.name变成n您期望的对象名称。

如果仅在生产中启用,这可能特别难以调试。

于 2017-03-08T00:06:22.933 回答
3

我想从上面的答案和评论中整合一些东西。

让类名起作用的最确定的方法(尤其是在缩小之后)是name在类本身上设置一个属性。以下所有内容都是等效的

// option 1
function MyClass() {}
MyClass.name = 'MyClass'

// option 2
class MyClass {}
MyClass.name = 'MyClass'

// option 3 (preferred)
class MyClass {
  static name = 'MyClass'
}

如果您希望类名是动态的,请创建一个工厂:

function classFactory(className) {
    return class {
        static name = className;
    }
}

const MyClass = classFactory('MyClass')
于 2020-06-29T21:30:00.673 回答