Javascript 获取对象或类的名称

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10314338/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-24 00:49:42  来源:igfitidea点击:

Get name of object or class

javascript

提问by TJR

Is there any solution to get the function name of an object?

有没有办法获取对象的函数名?

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) {...}- there is no information about the classNameor ObjectName. Is it possible to get one of them?

for (var k in this) {...}- 没有关于className或 的信息ObjectName。是否有可能获得其中之一?

回答by Oleg V. Volkov

Get your object's constructorfunction and then inspect its nameproperty.

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

myObj.constructor.name

Returns "myClass".

返回“myClass”。

回答by Eduardo Cuomo

Example:

例子:

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"

回答by Pavel Savara

If you use standard IIFE (for example with TypeScript)

如果您使用标准 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 = {}));

you could annotate the prototypes upfront with

您可以预先注释原型

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

and then use _fullname and _classname fields.

然后使用 _fullname 和 _classname 字段。

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

annotating function here:

注释功能在这里:

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

提琴手

回答by ?erban Ghi??

As this was already answered, I just wanted to point out the differences in approaches on getting the constructor of an object in JavaScript. There is a difference between the constructor and the actual object/class name. If the following adds to the complexity of your decision then maybe you're looking for instanceof. Or maybe you should ask yourself "Why am I doing this? Is this really what I am trying to solve?"

由于已经回答了这个问题,我只想指出在 JavaScript 中获取对象构造函数的方法的差异。构造函数和实际对象/类名称之间存在差异。如果以下内容增加了您决定的复杂性,那么您可能正在寻找instanceof. 或者也许你应该问自己“我为什么要这样做?这真的是我想要解决的问题吗?”

Notes:

笔记:

The obj.constructor.nameis not available on older browsers. Matching (\w+)should satisfy ES6 style classes.

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

Code:

代码:

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));

Result:

结果:

enter image description here

在此处输入图片说明

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

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

回答by Scott

I was facing a similar difficulty and none of the solutions presented here were optimal for what I was working on. What I had was a series of functions to display content in a modal and I was trying to refactor it under a single object definition making the functions, methods of the class. The problem came in when I found one of the methods created some nav-buttons inside the modal themselves which used an onClick to one of the functions -- now an object of the class. I have considered (and am still considering) other methods to handle these nav buttons, but I was able to find the variable name for the class itself by sweeping the variables defined in the parent window. What I did was search for anything matching the 'instanceof' my class, and in case there might be more than one, I compared a specific property that was likely to be unique to each instance:

我面临着类似的困难,这里提供的解决方案都不是我正在处理的最佳解决方案。我拥有的是一系列在模式中显示内容的函数,我试图在单个对象定义下重构它,以创建类的函数和方法。当我发现其中一种方法在模态本身内部创建了一些导航按钮时,问题就出现了,这些按钮使用 onClick 到其中一个函数 - 现在是类的对象。我已经考虑(并且仍在考虑)处理这些导航按钮的其他方法,但是我能够通过扫描父窗口中定义的变量来找到类本身的变量名称。我所做的是搜索与我的班级的“实例”匹配的任何内容,以防万一可能不止一个,

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;
    }
}

回答by Vladimir Bushma

All we need:

我们所需要的:

  1. Wrap a constant in a function (where the name of the function equals the name of the object we want to get)
  2. Use arrow functions inside the object
  1. 将一个常量包裹在一个函数中(其中函数的名称等于我们想要获取的对象的名称)
  2. 在对象内部使用箭头函数

console.clear();
function App(){ // name of my constant is App
  return {
  a: {
    b: {
      c: ()=>{ // very important here, use arrow function 
        console.log(this.constructor.name)
      }
    }
  }
}
}
const obj = new App(); // usage

obj.a.b.c(); // App

// usage with react props etc, 
// For instance, we want to pass this callback to some component

const myComponent = {};
myComponent.customProps = obj.a.b.c;
myComponent.customProps(); // App

回答by Mohamed Karray

Try this:

尝试这个:

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