Javascript 如何在自定义对象上指定.constructor.name?

Javascript 如何在自定义对象上指定.constructor.name?,javascript,object,constructor,instance,instanceof,Javascript,Object,Constructor,Instance,Instanceof,这个问题确实很简单,但我无法通过谷歌或duckduckgo找到答案,可能是因为99%的初学者教程都涉及使用名称属性创建人物对象(与constructor.name无关,但会污染搜索结果) 可以使用instance.constructor.name检测对象的实例对象: var foo = new Object; foo.constructor.name; // "Object" 如何在自己的对象上设置构造函数名称 var Bar = function(){}; var baz = new Bar

这个问题确实很简单,但我无法通过谷歌或duckduckgo找到答案,可能是因为99%的初学者教程都涉及使用
名称
属性创建
人物
对象(与constructor.name无关,但会污染搜索结果)

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

var foo = new Object;
foo.constructor.name; // "Object"
如何在自己的对象上设置构造函数名称

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

baz.constructor.name/“”不是将构造函数定义为设置为匿名函数的变量
Bar
,而是可以执行以下操作:

function Bar() {}
或者这个:

var Bar = function ConstructorNameHere() {};
其中,
ConstructorNameHere
名称实际上也可以是
Bar

var Bar = function Bar() {};

(这应该适用于Chrome和FF,不确定,但对IE不是很有希望。)

重要警告:

如果您使用JS缩略器,那么名称可能会被优化掉,并且突然
构造函数.name
变成
n
而不是您期望的对象名称


如果只在生产环境中启用,那么调试起来可能会特别困难。

我想从上面的答案和评论中总结一些东西

让类名起作用的最确定的方法(尤其是在缩小后)是在类本身上设置
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')

如果(baz.constructor==Bar)
.name
没有那么可靠,您可以测试
,如果是+1,或者类似地,您可以测试Bar的
baz实例,但是当您只为一个javascript引擎(例如
nodejs
)开发时,.name的可靠性不是问题。我想知道这是怎么回事。nnnnnn回答了这个问题的全部内容。:)谢谢,我不知道函数的“隐私”在构造函数名称中起了作用。回答得好。认可的!为V8(Chromium/node.js)开发不是问题。有没有办法使
ConstructorNameHere
动态化?i、 例如,@YuvalA.-您可以使用类工厂来实现这一点。请参阅下面我的答案。如果您使用了
MyClass.name='MyClass'
或添加了一个静态名称属性:
static name='MyClass'
,则这是固定的。我发现这一点更加明确,尽管只是例行公事。使用
static
属性使其接近类定义,并且类名称很少更改:
classmyclass{static name='MyClass'}
有趣的解决方案。我会有点害怕使用它,但它可能没问题。同意,但对我来说,它比在开发过程中使用一个值,在prod构建中使用另一个值要安全得多。