在javascript中获取对象或类的名称

有没有解决scheme来获取对象的函数名称?

function alertClassOrObject (o) { window.alert(o.objectName); //"myObj" OR "myClass" as a String } function myClass () { this.foo = function () { alertClassOrObject(this); } } var myObj = new myClass(); myObj.foo(); 

for(var k in this){…} – 没有关于className或ObjectName的信息。 是否有可能得到其中之一? 在PHP中它可能 – 但我没有find任何解决scheme在互联网上得到它的JavaScript。

获取对象的构造函数,然后检查其名称属性。

 myObj.constructor.name 

返回“myClass”。

例:

 function Foo () { ... } var Bar = function () { ... } var Abc = function Xyz() { ... } var f = new Foo(); var b = new Bar(); var c = new Abc(); alert(f.constructor.name); // -> "Foo" alert(b.constructor.name); // -> "Function" alert(c.constructor.name); // -> "Xyz" 

如果您使用标准IIFE(例如TypeScript)

 var Zamboch; (function (_Zamboch) { (function (Web) { (function (Common) { var App = (function () { function App() { } App.prototype.hello = function () { console.log('Hello App'); }; return App; })(); Common.App = App; })(Web.Common || (Web.Common = {})); var Common = Web.Common; })(_Zamboch.Web || (_Zamboch.Web = {})); var Web = _Zamboch.Web; })(Zamboch || (Zamboch = {})); 

你可以预先注释原型

 setupReflection(Zamboch, 'Zamboch', 'Zamboch'); 

然后使用_fullname和_classname字段。

 var app=new Zamboch.Web.Common.App(); console.log(app._fullname); 

注释function在这里:

 function setupReflection(ns, fullname, name) { // I have only classes and namespaces starting with capital letter if (name[0] >= 'A' && name[0] <= 'Z') { var type = typeof ns; if (type == 'object') { ns._refmark = ns._refmark || 0; ns._fullname = fullname; var keys = Object.keys(ns); if (keys.length != ns._refmark) { // set marker to avoid recusion, just in case ns._refmark = keys.length; for (var nested in ns) { var nestedvalue = ns[nested]; setupReflection(nestedvalue, fullname + '.' + nested, nested); } } } else if (type == 'function' && ns.prototype) { ns._fullname = fullname; ns._classname = name; ns.prototype._fullname = fullname; ns.prototype._classname = name; } } } 

的jsfiddle

尝试这个:

 var classname = ("" + obj.constructor).split("function ")[1].split("(")[0]; 

由于这已经得到解答,我只想指出在JavaScript中获取对象的构造方法的不同之处。 构造函数和实际的对象/类名称是有区别的。 如果以下内容增加了您的决定的复杂性,那么也许您正在寻找instanceof 。 或者,也许你应该问自己:“我为什么要这样做?这真的是我想要解决的吗?

笔记:

obj.constructor.name在旧浏览器上不可用。 匹配(\w+)应该满足ES6风格的类。

码:

 var what = function(obj) { return obj.toString().match(/ (\w+)/)[1]; }; var p; // Normal obj with constructor. function Entity() {} p = new Entity(); console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p)); // Obj with prototype overriden. function Player() { console.warn('Player constructor called.'); } Player.prototype = new Entity(); p = new Player(); console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p)); // Obj with constructor property overriden. function OtherPlayer() { console.warn('OtherPlayer constructor called.'); } OtherPlayer.constructor = new Player(); p = new OtherPlayer(); console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p)); // Anonymous function obj. p = new Function(""); console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p)); // No constructor here. p = {}; console.log("constructor:", what(p.constructor), "name:", p.constructor.name, "class:", what(p)); // ES6 class. class NPC { constructor() { } } p = new NPC(); console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p)); // ES6 class extended class Boss extends NPC { constructor() { super(); } } p = new Boss(); console.log("constructor:", what(p.constructor), "name:", p.constructor.name , "class:", what(p)); 

结果:

在这里输入图像说明

代码: https : //jsbin.com/wikiji/edit?js,console

我面临着类似的困难,这里提出的解决scheme都不是最适合我的工作。 我有一系列的function来显示模式中的内容,我试图在一个单一的对象定义下重构它,使得类的function,方法。 问题来了,当我发现其中一种方法创build了一些模式内的导航button本身使用onClick函数之一 – 现在是类的一个对象。 我已经考虑(并且仍在考虑)处理这些导航button的其他方法,但是我能够通过清除父窗口中定义的variables来find类本身的variables名称。 我所做的是search与我的类的“instanceof”相匹配的任何内容,如果可能有多个,我比较了每个实例可能唯一的特定属性:

 var myClass = function(varName) { this.instanceName = ((varName != null) && (typeof(varName) == 'string') && (varName != '')) ? varName : null; /** * caching autosweep of window to try to find this instance's variable name **/ this.getInstanceName = function() { if(this.instanceName == null) { for(z in window) { if((window[z] instanceof myClass) && (window[z].uniqueProperty === this.uniqueProperty)) { this.instanceName = z; break; } } } return this.instanceName; } }