JS угловой конструктор гидрат абстракция

JS FRAMEWORK/ LIBS:

Я использую Angular 1.5.x и lodash 4.икс.

ВОПРОС:

Я новичок в JS и борюсь с тем, как ввести новый экземпляр объекта в абстрагированную функцию (в идеале фабрику). В моем классе обслуживания FormServiceу меня есть функция создает FormModel(объект) и увлажняет его конструктор — hydrateModel = function(arr). Есть ли в любом случае, чтобы абстрагировать это в универсальную функцию или класс фабрики, чтобы я мог объектировать новый экземпляр универсального объекта.

Я могу сделать это с серверными языками, но я изо всех сил стараюсь сделать этот тип синтаксиса работающим с JS, который заставляет меня реплицировать hydrateModelфункцию для каждого экземпляра модели данных (uGly). Сказал по-другому, как я могу сделать или в идеале . Цените любое руководство. В идеале это имеет смысл и извинения, если есть основной ответ.

EDIT-ИДЕАЛЬНЫЙ РЕЗУЛЬТАТ

Было бы сделать что-то вроде этого, что, очевидно, не работает.

      hydrateModel = function(arr, varObjectInstance) {
            var newArr = [];
            _.each(arr, function (obj,k) {
               // is it possible in JS to inject a new object and reference it dynamically with a different set of dynamic arguments
                newArr.push( [varObjectInstance](obj, fillable));
            });

            return newArr;
        },

        hydrateModel(arr, new ObjectInstance())

Пример, в PHP вы могли бы сказатьnew $var($arguments)

КОНТЕКСТ КОДА ССЫЛКИ

// note I've removed the __constructor for brevity sake but it is a fairly basic object extend class

FormModel.$inject = ['__constructor', 'object'];
function FormModel(__constructor, object) {
    function Form(data, keys) {
        __constructor.call(this, data, keys);
    }

    Form.prototype = Object.create(__constructor.prototype);
    Form.prototype.constructor = Form;
    return Form;
}

FormService.$inject = ['FormModel', 'FormDataService'];
function FormService(FormModel,FormDataService) {
    var service = this,
        forms = {},
        fillable = ['app_id','name','class','label','type','maxlength','minlength','placeholder','required','autocomplete','index','helpTitle','helpDescription','messages'],
        hydrateModel = function(arr) {
            var formEloquent = [];
            _.each(arr, function (obj,k) {
                formEloquent.push( new FormModel(obj, fillable));
            });

            return formEloquent;
        };

   // INIT function: 1. get form field (email, name, password,etc) data for 3 forms along with help messages etc.
    service.initForms = function () {
        var self = this;
        _.each({
            register:FormDataService.getRegisterData(), // not including FormDataService for brevity sake but it is  http api service to backend
            contact:FormDataService.getContactData(),
            subscribe:FormDataService.getSubscribeData()
        }, function (obj, key) {
            forms[key] = {
                model:{},
                current:1,
               // below is my question - how could create a function / factory hydrateModel(obj, newGenericObjectInstance) that would be generic so that I can call new [newGenericObjectInstance](arguments) here or in the hydrateModel
                data:hydrateModel(obj),
                view:{},
                state:{},
                help:{}
            }
        });
    };

    return {
        initForms: function () {
            return service.initForms();
        }
    }
}

ПРИМЕР ДАННЫХ

Пример строки данных поля формы, возвращенной из FormDataService (basic)

    var formFieldRowExample = {
        id: '1010',
        name: 'email',
        class: 'form--input',
        label: 'Enter your email',
        type: 'email',
        maxlength: 50,
        minlength: 4,
        placeholder: 'Example: person@example.com',
        required: true,
        autocomplete: 'on',
        validation: [
        {
            type: 'email',
            message: 'Email must be a valid email address'
        },
        {
            type: 'minlength',
            message: 'Your email address is too short'
        },
        {
            type: 'maxlength',
            message: 'Your email address is too long'
        },
        {
            type: 'required',
            message: 'Your email address is required'
        }
    ]
    };

1 ответ

  1. В приведенном выше примере varObjectInstanceэто объект, а не функция конструктора. Его нельзя назвать или newed.

    Работоспособный код может выглядеть следующим образом

      hydrateModel = function(arr, Cls) {
        var newArr = [];
        ...
        newArr.push(new Cls(obj, fillable));
        ...
      }
    
      hydrateModel(arr, ObjectInstance)