在 JavaScript 中,沒有與 Java 的「class.getName()」方法直接等效的方法來取得物件類別的名稱。
ES2015 更新:
class Foo {} console.log(Foo.name); // "Foo"
對於非類別對象,「類別」可以使用 'thing.constructor.name' 屬性找到指定。
var obj = {name: "John"}; console.log(obj.constructor.name); // "Object"
駭客與替代方案:
雖然沒有原生的'class.getName( )' 等價,有各種hack 和替代方法來取得該類別name:
Object.prototype.getName() Hack(不建議):
此 hack 修改了對象原型並向所有對象添加了“getName()”函數對象,使它們能夠以字符串形式返回其構造函數名稱。
Object.prototype.getName = function() { var funcNameRegex = /function (.{1,})\(/; var results = funcNameRegex.exec(this.constructor.toString()); return results && results.length > 1 ? results[1] : ""; }; var obj = {name: "John"}; console.log(obj.getName()); // "Object"
使用建構子屬性(有問題):
每個物件都有一個「建構子」屬性,該屬性指向建立它的建構子。
var myArray = [1, 2, 3]; console.log(myArray.constructor === Array); // true
但是,依賴「建構子」屬性是有問題的,因為:
使用instanceof(也有問題):
'instanceof'運算子也可以用於型別檢查。
var myArray = [1, 2, 3]; console.log(myArray instanceof Array); // true
但是, 'instanceof' 不適用於文字值,也會破壞跨框架和跨視窗。
使用 Object.prototype.toString:
Object.prototype.toString傳回物件類型的字串表示形式。
console.log(Object.prototype.toString.call('abc')); // "[object String]" console.log(Object.prototype.toString.call(/abc/)); // "[object RegExp]"
雖然此方法提供了類型資訊內建類型,它為所有使用者定義類型傳回「Object」。
注意事項:
上述所有方法都有警告,且在以下情況下可能不可靠所有情況。考慮物件的建構方法,尤其是在處理繼承和匿名函數時。
以上是如何在 JavaScript 中取得物件的類別名稱?的詳細內容。更多資訊請關注PHP中文網其他相關文章!