Récupère le nom de l’object ou de la classe

Existe-t-il une solution pour obtenir le nom de la fonction d’un object?

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

for (var k in this) {...} – il n’y a pas d’informations sur className ou className . Est-il possible d’en obtenir un?

Obtenez la fonction constructeur de votre object, puis inspectez sa propriété name .

 myObj.constructor.name 

Retourne “myClass”.

Exemple:

 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" 

Si vous utilisez le standard IIFE (par exemple avec 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 = {})); 

vous pouvez annoter les prototypes avec

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

puis utilisez les champs _fullname et _classname.

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

fonction d’annotation ici:

 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

Essaye ça:

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

Comme cela a déjà été répondu, je voulais juste souligner les différences d’approches pour obtenir le constructeur d’un object en JavaScript. Il y a une différence entre le constructeur et le nom de l’object / classe réel. Si ce qui suit ajoute à la complexité de votre décision, alors vous recherchez peut-être instanceof . Ou peut-être devriez-vous vous demander “Pourquoi est-ce que je fais cela? Est-ce vraiment ce que je suis en train d’essayer de résoudre?”

Remarques:

obj.constructor.name n’est pas disponible sur les anciens navigateurs. La correspondance (\w+) devrait satisfaire les classes de style ES6.

Code:

 var what = function(obj) { return obj.toSsortingng().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)); 

Résultat:

entrer la description de l'image ici

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

J’étais confronté à une difficulté similaire et aucune des solutions présentées ici n’était optimale pour ce que je travaillais. Ce que j’avais était une série de fonctions pour afficher le contenu dans un modal et j’essayais de le refactoriser sous une définition d’object unique en faisant les fonctions, les méthodes de la classe. Le problème est survenu lorsque j’ai découvert que l’une des méthodes créait des boutons de navigation à l’intérieur du modal eux-mêmes, qui utilisaient un onClick pour l’une des fonctions – maintenant un object de la classe. J’ai envisagé (et envisage toujours) d’autres méthodes pour gérer ces boutons de navigation, mais j’ai pu trouver le nom de la variable en balayant les variables définies dans la fenêtre parente. Ce que j’ai fait, c’est rechercher tout ce qui correspond à l’instance de ma classe, et au cas où il y en aurait plus d’une, j’ai comparé une propriété spécifique susceptible d’être unique à chaque instance:

 var myClass = function(varName) { this.instanceName = ((varName != null) && (typeof(varName) == 'ssortingng') && (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; } }