263 votes

Obtenir le nom d'un objet ou d'une classe

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

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) {...} - il n'y a aucune information sur le className ou ObjectName . Est-il possible d'en obtenir un ?

0 votes

Vous pourriez vouloir voir ça : stackoverflow.com/questions/789675/

447voto

Oleg V. Volkov Points 9724

Obtenez le nom de votre objet Constructeur puis d'inspecter sa fonction nom propriété.

myObj.constructor.name

Retourne "myClass".

205 votes

Attention ! Si vous réduisez le JavaScript, le nom du constructeur changera.

39 votes

Pratique, mais il y a un autre problème : si votre objet a un prototype chaîne (à part Object ), vous obtiendrez le nom de l'objet de l'enquête. premièrement dans cette chaîne, et non le nom du constructeur utilisé pour créer l'objet. Prenons l'exemple suivant : function Daddy() {}; function Me() {}; Me.prototype = new Daddy; me = new Me; . me.constructor.name puis revient de manière inattendue 'Daddy' pas 'Me' .

7 votes

Il faut également savoir que la propriété name n'est pas supportée dans < IE9

33voto

Eduardo Cuomo Points 1433

Exemple :

function Foo () { console.log('Foo function'); }
var f = new Foo();
console.log('f', f.constructor.name); // -> "Foo"

var Bar = function () { console.log('Anonymous function (as Bar)'); };
var b = new Bar();
console.log('b', b.constructor.name); // -> "Bar"

var Abc = function Xyz() { console.log('Xyz function (as Abc)'); };
var a = new Abc();
console.log('a', a.constructor.name); // -> "Xyz"

class Clazz { constructor() { console.log('Clazz class'); } }
var c = new Clazz();
console.log('c', c.constructor.name); // -> "Clazz"

var otherClass = class Cla2 { constructor() { console.log('Cla2 class (as otherClass)'); } }
var c2 = new otherClass();
console.log('c2', c2.constructor.name); // -> "Cla2"

0 votes

On dirait que lorsqu'on utilise le modèle de module révélateur, on obtient toujours "Object". function Foo() { return {'foo':'bar'} }; var f = new Foo(); :(

1 votes

Le journal 'b' affiche maintenant "Bar" dans FF88 et Node (par l'intermédiaire de katacoda.com/cours/nodejs/playground ). Il semble que les fonctions anonymes héritent maintenant du nom de leur variable. Et, au cas où vous vous poseriez la question, les classes utilisent le nom de la classe utilisé avec la fonction new .

0 votes

@DerekWhite c'est vrai ! Poste mis à jour.

7voto

serbanghita Points 662

Comme il a déjà été répondu à cette question, je voulais juste souligner les différences d'approches pour obtenir le constructeur d'un objet en JavaScript. Il y a une différence entre le constructeur et le nom réel de l'objet/de la classe. 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 ça ? Est-ce vraiment ce que j'essaie de résoudre ?"

Notes :

El obj.constructor.name n'est pas disponible sur les anciens navigateurs. Correspondant (\w+) doivent satisfaire aux classes de style 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));

Résultat :

enter image description here

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

5voto

Pavel Savara Points 1745

Si vous utilisez un IIFE standard (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 pourriez annoter les prototypes en amont avec

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

puis utiliser 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] &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;
        }
    }
}

JsFiddle

3voto

Mohamed Karray Points 45

Essayez ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X