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

时间:2013-06-18 12:50:39

标签: javascript object constructor instance instanceof

这个问题确实必须相当简单,但我不能谷歌或者解决这个问题,可能是因为99%的初学者教程涉及创建一个Person对象,其name属性(与该属性无关) constructor.name但污染了搜索结果。)

可以使用instance.constructor.name:

检测Object对象的实例
var foo = new Object;
foo.constructor.name; // "Object"

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

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

3 个答案:

答案 0 :(得分:10)

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

function Bar() {}

或者这个:

var Bar = function ConstructorNameHere() {};

ConstructorNameHere名称实际上可以再次Bar

var Bar = function Bar() {};

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

答案 1 :(得分: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')

答案 2 :(得分:1)

重要警告:

如果您使用JS minifier,那么名称可能会被优化掉,突然n变为func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: AnyObject]) 而不是您期望的对象名称。

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