【问题标题】:How do I specify .constructor.name on a custom object?如何在自定义对象上指定 .constructor.name?
【发布时间】:2013-06-14 16:40:16
【问题描述】:

这个问题确实很简单,但我不能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

【问题讨论】:

  • 你可以测试if( baz.constructor === Bar ).name 不是那么可靠
  • True,+1,或者类似的你可以测试baz instanceof Bar,但是当你只为一个javascript引擎(例如nodejs)开发时,.name的可靠性不是问题。我更想知道这应该如何工作。 nnnnnn 完整地回答了这个问题。 :)

标签: javascript object constructor instance instanceof


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    重要警告:

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

    如果仅在生产环境中启用,调试起来尤其困难。

    【讨论】:

    • 如果您使用 MyClass.name = 'MyClass' 或添加静态名称属性:static name = 'MyClass' 如果您正在使用该功能,则此问题已修复。我发现这更明确,尽管样板-y。使用static 属性使其接近类定义,并且类名很少更改:class MyClass { static name = 'MyClass' }
    • 有趣的解决方案。我会有点害怕使用它,但它可能没关系。
    • 同意,不过对我来说,这比在开发过程中拥有一个值并在产品构建中拥有另一个值要可怕得多。
    【解决方案3】:

    除了将构造函数定义为设置为匿名函数的变量Bar,您还可以这样做:

    function Bar() {}
    

    或者这个:

    var Bar = function ConstructorNameHere() {};
    

    ConstructorNameHere 名称实际上又可以是 Bar

    var Bar = function Bar() {};
    

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

    【讨论】:

    • 谢谢,我不知道函数的“隐私”在构造函数名称中起了作用。好答案。接受!
    • 没问题,为 V8 (Chromium/node.js) 开发。
    • 有什么方法可以让ConstructorNameHere 动态化吗?即例如将其作为参数传递。
    • @YuvalA。 - 你可以使用类工厂来做到这一点。请参阅下面的答案。
    猜你喜欢
    • 2014-09-28
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 2016-05-07
    相关资源
    最近更新 更多