簡體   English   中英

獲取對象的構造函數名稱

[英]Get constructor name of object

如何獲取對象類的名稱? 我的意思是在這個例子中的“過程” 在此處輸入圖片說明

我看到有兩種方法可以得到它。 第一個是在這個類中編寫一個吸氣劑,比如

 getClassName(){return "Process"}

但是我想如果我試圖在不屬於這個類並且沒有這樣的方法的對象中調用這個方法,那將是一個錯誤。

第二個是使用object instanceof Process 但也許有一些方法可以使它更好更正確?

您可以從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 thencatch回報(見第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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM