我查看了这个reference link并最终使用了Matthew的解决方案,因为它适用于我。
var factory ={};
factory.Tree = function(arg1,arg2,arg3,arg4){
console.log(arg1+""+arg2+""+arg3+""+arg4);
}
function instantiate(classname){
return new (function(a){ return factory[classname].apply(this,a);})(Array.prototype.splice.call(arguments,1));
// also is this ^^^ a good practice? instead of declaring the temp function beforehand
// function t(a) {return factory[classname].apply(this,a);}
// return new t(Array.prototype.splice.call(arguments,1));
}
var newObj = instantiate("Tree",1,2,3,4); // this prints 1234 --> works
虽然,我不确定为什么使用user123444555621的解决方案只有在我传入“参数”(即包括“classname”在内的所有内容)时才有效:
function instantiate(classname){
return new (Function.prototype.bind.apply(factory[classname], arguments));
}
var newObj = instantiate("Tree",1,2,3,4); // this prints 1234 --> works
但是如果我切换“arguments”并删除“classname”,那么传入结果数组,它就不会按预期工作:
function instantiate(classname){
var args = Array.prototype.splice.call(arguments,1);
// ^^ I checked and this prints 1,2,3,4 as well
return new (Function.prototype.bind.apply(factory[classname], args));
}
var newObj = instantiate("Tree",1,2,3,4); // this prints 234undefined
我不知道为什么但不知怎的,似乎args数组被切片(再次)并删除了它的第一个元素(在这种情况下为1)。
有人可以提供任何见解吗?感谢
答案 0 :(得分:1)
您是否使用了正确的数组函数slice vs splice?
Array.prototype.slice() - 从现有数组的元素创建新数组。它不会修改原始数组。
Array.prototype.splice() - 删除和/或插入数组中的元素。与slice()不同,splice()方法修改原始数组 并返回一个新数组。 splice()方法有三个参数。
答案 1 :(得分:0)
你的问题就在这一行
var args = Array.prototype.splice.call(arguments,1);
您已基本删除arguments
中的第一个项目,同时将其转换为数组args
只需将 1 替换为 0
var args = Array.prototype.splice.call(arguments,0);
<强>样本强>
var factory ={};
factory.Tree = function(arg1,arg2,arg3,arg4){
console.log(arg1+""+arg2+""+arg3+""+arg4);
}
function instantiate(classname){
var args = Array.prototype.splice.call(arguments,0);
return new (Function.prototype.bind.apply(factory[classname], args));
}
instantiate("Tree",1,2,3,4);
&#13;