获取对象或类的名称

TJR*_*TJR 181 javascript

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

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();
Run Code Online (Sandbox Code Playgroud)

for (var k in this) {...}- 没有关于className或的信息ObjectName.有可能得到其中一个吗?

Ole*_*kov 315

获取对象的构造函数,然后检查其name属性.

myObj.constructor.name
Run Code Online (Sandbox Code Playgroud)

返回"myClass".

  • 谨防!如果你正在缩小JavaScript,那么构造函数的名称将会改变. (155认同)
  • 方便,但还有另一个警告:如果你的对象有一个原型*链*(除了`Object`),你将获得该链中*first*链接的名称,而不是用于创建该链的构造函数的名称.宾语.举例如下:`function Daddy(){}; function Me(){}; Me.prototype =新爸爸; 我=新我;`.然后`me.constructor.name`意外地返回''爸爸',而不是''我'. (32认同)
  • 如果在通过变量声明的对象上使用,这将返回空字符串:`var Foo = function(){};`. (9认同)
  • 另外值得知道<IE9中不支持name属性 (7认同)
  • Chrome控制台知道你不知道的东西:`> myclass =(function(){}); new myclass`打印`myclass {}` (2认同)
  • @ mklement0如果你指定给`Me.prototype`你必须记得做'Me.prototype.constructor = Me`.然后`new Me().constructor.name`将是"我".如果您使用ES6类进行继承,它将为您执行此操作. (2认同)

Edu*_*omo 22

例:

function Foo () { console.log('Foo function'); }
var Bar = function () { console.log('Bar function'); };
var Abc = function Xyz() { console.log('Abc function'); };

var f = new Foo();
var b = new Bar();
var a = new Abc();

console.log('f', f.constructor.name); // -> "Foo"
console.log('b', b.constructor.name); // -> "Function"
console.log('a', a.constructor.name); // -> "Xyz"
Run Code Online (Sandbox Code Playgroud)


Pav*_*ara 5

如果您使用标准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 = {}));
Run Code Online (Sandbox Code Playgroud)

你可以预先注释原型

setupReflection(Zamboch, 'Zamboch', 'Zamboch');
Run Code Online (Sandbox Code Playgroud)

然后使用_fullname和_classname字段.

var app=new Zamboch.Web.Common.App();
console.log(app._fullname);
Run Code Online (Sandbox Code Playgroud)

注释函数在这里:

function setupReflection(ns, fullname, name) {
    // I have only classes and namespaces starting with capital letter
    if (name[0] >= 'A' && name[0] &lt;= '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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

的jsfiddle


Șer*_*iță 5

由于已经回答了这个问题,我只想指出在 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));
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明

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