获取对象类型的名称

是否有与Java等效的JavaScript class.getName()

阳光Itachi村村2020/03/09 23:02:38

使用class.name这也适用于function.name

class TestA {}
console.log(TestA.name); // "TestA"

function TestB() {}
console.log(TestB.name); // "TestB"
蛋蛋猴子前端2020/03/09 23:02:38

如果有人在寻找可以与jQuery一起使用的解决方案,那么这里是经过调整的Wiki代码(原始版本破坏了jQuery)。

Object.defineProperty(Object.prototype, "getClassName", {
    value: function() {
        var funcNameRegex = /function (.{1,})\(/;
        var results = (funcNameRegex).exec((this).constructor.toString());
        return (results && results.length > 1) ? results[1] : "";
    }
});
蛋蛋L西里2020/03/09 23:02:38

您可以获得的最接近的是typeof,但是对于任何类型的自定义类型,它仅返回“对象”。对于这些,请参阅Jason Bunting

编辑,Jason由于某种原因删除了他的帖子,因此只需使用Object的constructor属性即可。

西门小小2020/03/09 23:02:38

您可以使用“ instanceof”运算符来确定对象是否为某个类的实例。如果您不知道对象类型的名称,则可以使用其构造函数属性。对象的构造函数属性是对用于初始化它们的函数的引用。例:

function Circle (x,y,radius) {
    this._x = x;
    this._y = y;
    this._radius = raduius;
}
var c1 = new Circle(10,20,5);

现在,c1.constructor是对该Circle()函数的引用您也可以使用typeof运算符,但是typeof运算符显示的信息有限。一种解决方案是使用toString()Object全局对象方法。例如,如果您有一个对象,例如myObject,则可以使用toString()全局Object 方法来确定myObject类的类型。用这个:

Object.prototype.toString.apply(myObject);
2020/03/09 23:02:38

您可以使用instanceof运算符查看对象是否是另一个对象的实例,但是由于没有类,因此无法获得类名。

Davaid神乐2020/03/09 23:02:37

杰森邦廷(Jason Bunting)的答案给了我足够的线索来找到我需要的东西:

<<Object instance>>.constructor.name

因此,例如,在下面的代码中:

function MyObject() {}
var myInstance = new MyObject();

myInstance.constructor.name会回来的"MyObject"

JimAJim2020/03/09 23:02:37

我使用的一些小技巧:

function Square(){
    this.className = "Square";
    this.corners = 4;
}

var MySquare = new Square();
console.log(MySquare.className); // "Square"
阿飞Harry小胖2020/03/09 23:02:37

更新资料

确切地说,我认为OP要求一个函数来检索特定对象的构造函数名称。就Javascript而言,object它本身没有类型,而是and的类型但是,不同的对象可以具有不同的构造函数

Object.prototype.getConstructorName = function () {
   var str = (this.prototype ? this.prototype.constructor : this.constructor).toString();
   var cname = str.match(/function\s(\w*)/)[1];
   var aliases = ["", "anonymous", "Anonymous"];
   return aliases.indexOf(cname) > -1 ? "Function" : cname;
}

new Array().getConstructorName();  // returns "Array"
(function () {})().getConstructorName(); // returns "Function"

 


注意:以下示例已弃用。

一个博客帖子的链接基督教Sciberras包含有关如何做一个很好的例子。即,通过扩展对象原型:

if (!Object.prototype.getClassName) {
    Object.prototype.getClassName = function () {
        return Object.prototype.toString.call(this).match(/^\[object\s(.*)\]$/)[1];
    }
}

var test = [1,2,3,4,5];

alert(test.getClassName()); // returns Array