Я пытаюсь создать функцию, которая будет принимать аргументы arg1, arg2...
, а затем передавать их в конструктор для нового объекта C, например, так: new C(arg1, arg2...)
, поэтому для создания нового экземпляра C
пользователь будет просто иметьпозвонить C(arg)
вместо new C(arg)
.Вот моя первая попытка:
var C = function(a){ this.a = a; }
var Cn = function(){
new C.apply(this, arguments);
}
Cn(0) // Should make a new C with a property a equal to 0
new C(0) // ie the same as this
Редактировать: Обратите внимание, мне нужно принять произвольное количество аргументов и не использовать eval.Я делаю библиотеку, реализующую алгебраических типов данных в js.
Редактировать: Решением было взять Идея Джереми и адаптировать ее для получения неограниченногоколичество аргументов:
var C = function() {
// A unique object so we can identify when we used the 'newless' constructor
var newlessConstructorObj = {}
// Check to see if C has been called with `new`
if(!(this instanceof C))
// If not pass arguments as single arg back to C
return new C(newlessConstructorObj, arguments);
// Check to see if we got here from the line above, if so the arguments were passed in the second arg
var args = (arguments[0] === newlessConstructorObj) ? arguments[1] : arguments
// Do stuff with args
this.a = args[0];
}
C(0);
new C(0);