是否有与Java等效的JavaScript class.getName()
?
获取对象类型的名称
如果有人在寻找可以与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] : "";
}
});
您可以获得的最接近的是typeof
,但是对于任何类型的自定义类型,它仅返回“对象”。对于这些,请参阅Jason Bunting。
编辑,Jason由于某种原因删除了他的帖子,因此只需使用Object的constructor
属性即可。
您可以使用“ 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);
您可以使用instanceof
运算符查看对象是否是另一个对象的实例,但是由于没有类,因此无法获得类名。
杰森邦廷(Jason Bunting)的答案给了我足够的线索来找到我需要的东西:
<<Object instance>>.constructor.name
因此,例如,在下面的代码中:
function MyObject() {}
var myInstance = new MyObject();
myInstance.constructor.name
会回来的"MyObject"
。
我使用的一些小技巧:
function Square(){
this.className = "Square";
this.corners = 4;
}
var MySquare = new Square();
console.log(MySquare.className); // "Square"
更新资料
确切地说,我认为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
使用
class.name
。这也适用于function.name
。