[英]Get constructor name of object
您可以从constructor
name
获取它:
console.log(object.constructor.name);
例如,当您执行ex = new Example
,在正常的事情过程中,使Example.prototype
成为所创建对象的原型( ex
),并且该对象从该对象继承了一个constructor
属性,该属性返回到构造函数( Example
)。
我说“在正常情况下”是因为可以通过多种方式改变这些正常关系。 例如,代码可能已经使用对象上的自己的属性覆盖了constructor
属性( ex.constructor = somethingElse;
)。 要排除该特定情况,您可以使用:
console.log(Object.getPrototypeOf(object).constructor.name);
现场示例:
class Example1 { } const e1 = new Example1(); console.log(e1.constructor.name); // "Example1" class Example2 { constructor() { this.constructor = "I'm special"; } } const e2 = new Example2(); console.log(Object.getPrototypeOf(e2).constructor.name); // "Example2"
在TC39委员会成员指定的JavaScript很高兴足够使用实例的constructor
性质的Promise
建设新的承诺,当s then
和catch
回报(见第3步这里肚里这里并读取constructor
从实例)(和其他一些地方),因此如果您也使用它,您就不会独自外出。 他们甚至不去研究实例的原型。
但是,是的,只是为了完整起见,即使您访问它的原型,它仍然有可能使您误入歧途,因为原型的constructor
属性也可能被混淆:
class Example { } Example.prototype.constructor = Object; // Why would anyone do this? People are weird. const e = new Example(); console.log(Object.getPrototypeOf(e).constructor.name); // "Object"
也可以在函数上重新定义name
:
class Example { } // Why would someone do this? People are weird. Object.defineProperty(Example, "name", { value: "flibberdeegibbit" }); const e = new Example(); console.log(Object.getPrototypeOf(e).constructor.name); // "flibberdeegibbit"
所以...警告用户。
请注意,函数name
属性是 ES2015 的新属性( class
语法也是如此)。 如果您通过转译器使用class
语法,它可能会也可能不会正确设置name
。
通常,如果确定object
源自此类/函数,则object instanceof Process
是可取的。 可能有些情况并非如此。 多个Process
的出现可能是由于iframe、多个包版本等原因造成的。
常规函数类构造函数中已经存在name
属性。 一个已知的陷阱是它会在缩小的代码中被破坏,所以它在浏览器 JS 中通常是无用的,它的使用可以被认为是一种反模式。 name
不能重新分配(在某些浏览器中),因此需要一个单独的属性来标识类。
正确的方法是避免这个问题
但是我想如果我试图在不属于这个类并且没有这样的方法的对象中调用这个方法,那将是一个错误。
是使用吸气剂:
class Process {
get className() { return 'Process'; }
...
}
或者一个属性:
class Process {
...
}
Process.prototype.className = 'Process';
因此,可能有多个具有Process
className
标识符的Process
类。 这可能是可取的,也可能不是。 而instanceof
类实例与一个特定的类相关联。
在对象上使用.constructor.name
。 默认情况下,每个对象的构造函数都引用他的创建函数,该函数具有name属性。 它返回函数的名称。
class SomeClass { } const obj = new SomeClass(); console.log(obj.constructor.name);
使用name
属性如下:
class Process {} console.log(Process.name); const process = new Process; console.log(process.constructor.name);
这与使用函数的普通原型继承的工作方式相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.