Search code examples
javascriptclassnative-code

How to set name of class in the class-factory in JavaScript?


I'm using simple class-mechanism:

function define(SuperClass, name, proto)
{
    let ProtoFn = function(){};
    ProtoFn.prototype = SuperClass.prototype;
    let protoObj = new ProtoFn;

    var NewClass = function()
    {
        this.construct.apply(this, arguments);
    };
    _.extend(protoObj, proto,
        {
            constructor: NewClass,
            _class: NewClass,
            _parent: SuperClass
        });
    NewClass.prototype = protoObj;
    NewClass.className = name;
    NewClass.define = define.bind(null, NewClass);

    return NewClass;
}

Using:

let UserModel = Model.define('UserModel', { /* UserModel proto */ });
let john = new UserModel( /* blabla */ );

All right. But when I loging objects in Web Developer Tools I see "> NewClass {…}". Because variable in method "define" called "NewClass". I wanna see different class names in the console. How can I do that?

I've tried

  1. eval by new Function(name, function ${name}{ /* code */)
  2. protoObj.constructor = {name: name}
  3. let o = {}; o[name] = function(){...}; let NewClass = o[name]
  4. Object.defineProperty(NewClass, 'name', { get...
  5. NewClass.name = name; // throw error

P.S. sorry for my english


Solution

  • You can create a new object using the Function constructor and give it a name:

    var NewClass = new Function(
         "return function " + name + "(){ }"
    )();
    

    JsFiddle Example