@nootry
веб разработчик

Как создавать экземпляры класса с произвольным количеством аргументов?

Интересует возможность подобного использования функций в джаваскрипте.
Создание экземпляра класса с произвольным набором аргументов.

var  MyClass = function(){
      console.log( arguments.length );
};

var Args1 = [ 1 ];
var Args2 = [ 1, 2 ];
var Args3 = [ 1, 2, 3 ];

// Что-то вроде того, чего хочется добиться.
var NewObject1 = new MyClass( Args1  );
var NewObject2 = new MyClass( Args2  );
var NewObject3 = new MyClass( Args3  );


Нет проблемы отправлять в свою функцию при создании экземпляра объект или массив.
Замечу, что речь идет о использовании уже созданных классов в большой, грамотной библиотеке.
И запускать свои корявые руки в её код совсем не охота.
Будьте добры, помогите с решением этого вопроса средствами нативного JS.
Спасибо!
  • Вопрос задан
  • 266 просмотров
Решения вопроса 1
var args = [1,2,3,4];

//es5
var myClassInstance = new (Function.prototype.bind.apply(MyClass, [null].concat(args)));

//es6
var myClassInstance = new MyClass(...args);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@nootry Автор вопроса
веб разработчик
По ходу удалось вопрос решить с помощью eval;

var LockedClass = function(){
};

var ClassUnlock= function( locked, args ){

var functionLikeString = 'new ' + locked +' (';
_.each( args , function( opt, i ){
    functionLikeString += 'args ['+i+']';
    if(i < args .length-1){ 
        functionLikeString += ', ' 
    }
});
functionLikeString += ')';
return eval(  functionLikeString  );
}

var NewObject1 = ClassUnlock( LockedClass, [ 1]);
var NewObject2 = ClassUnlock( LockedClass, [ 1, 2]);
var NewObject3 = ClassUnlock( LockedClass, [ 1, 2, 3, 4, ....]);


Но этим методом совершенно не хочется пользоваться.
Нет к нему никакого доверия.
Ответ написан
Комментировать
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
передавайте массив. У объектов по хорошему не должно быть "переменное" количество аргументов. Это как никак зависимости оных, а если у нас зависимости плавают то нам будет чертовски сложно управлять этими зависимостями и код со временем превратится в кашу.

Ну либо используйте решение Николай, особенно ES6 вариант.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы