Как установить имя класса в фабрике классов в JavaScript?

Я использую простой механизм классов:

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

С использованием:

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

Отлично. Но когда я регистрирую объекты в инструментах веб-разработчика, я вижу «> NewClass {…}». Потому что переменная в методе "define" называется "NewClass". Я хочу видеть разные имена классов в консоли. Как я могу это сделать?

я пробовал

  1. eval по новой функции (имя, function ${name}{ /* code */)
  2. protoObj.constructor = {имя: имя}
  3. пусть о = {}; о[имя] = функция(){...}; пусть NewClass = o[имя]
  4. Object.defineProperty(NewClass, 'имя', {получить...
  5. НовыйКласс.имя = имя; // бросаем ошибку

P.S. Извините за мой английский


person faiwer    schedule 28.09.2015    source источник
comment
Если я правильно понял ваш вопрос, это может быть ответ stackoverflow. com/questions/9803947/создать-объект-из-строки   -  person halfzebra    schedule 28.09.2015
comment
Я говорю об этом: ftp.faiwer.ru/img_28_09_14:58:48_8ef23be22f4 .png . Я хочу видеть › A вместо NewClass   -  person faiwer    schedule 28.09.2015
comment
Не то чтобы я говорил, что вы должны его использовать, но ради интереса, почему eval не сработало? var NewClass = eval("(function " + name + "() {})"); должно работать нормально. Пример. Кроме того, вы неправильно передаете свои параметры в своем примере   -  person CodingIntrigue    schedule 28.09.2015
comment
@RGraham, хм... Хорошо. Пробовал только new Function вариант. И это не сработало. Вариант с window.eval рабочим.   -  person faiwer    schedule 28.09.2015
comment
@faiwer Что такое this.construct? Вы имеете в виду Reflect.construct ?   -  person CodingIntrigue    schedule 28.09.2015
comment
@RGraham, нет. Это равно __construct в php.   -  person faiwer    schedule 28.09.2015
comment
@halfzebra попробуйте без строковых литералов. Используйте переменную вместо «Foo» :)   -  person faiwer    schedule 28.09.2015
comment
@faiwer правда, я этого не проверял.   -  person halfzebra    schedule 28.09.2015


Ответы (1)


Вы можете создать новый объект с помощью конструктора функций и дать ему имя:

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

Пример JsFiddle

person CodingIntrigue    schedule 28.09.2015
comment
Хорошо. Вы правы, я использовал неправильные параметры раньше. Может быть существует вариант без eval? Для производства? - person faiwer; 28.09.2015