[英]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.