Я пытаюсь создать функцию, которая будет принимать аргументы 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
Edit: Обратите внимание, мне нужно, чтобы принимать произвольное число аргументов и не использовать Eval. Я делаю библиотеку, реализующую Algebraic Data Types в js.
Edit: Решение было принять Jeremy's Idea и адаптировать его принять неограниченное число аргументов:
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);
+1: кажется, хорошая адаптация одноэлементного рисунка ... правильно? – fcalderan
Это выглядит очень красиво и решает одну из моих других проблем (это 'C'! =' Cn'). Я посмотрю, смогу ли я изменить свой код, чтобы работать так. –
приятно, но он не передает аргументы. – c69