在javascript

时间:2016-04-16 07:17:18

标签: javascript class

我查看了这个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)。

有人可以提供任何见解吗?感谢

2 个答案:

答案 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);

<强>样本

&#13;
&#13;
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;
&#13;
&#13;