下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到 4 个日志,其中包含我传递给SayHello
的参数。
var App = {};
(function(that){
that.SayHello = function(){
console.log( arguments );
return {
doSomething: function(){
console.log('done');
}
};
};
var obj = {
t: new that.SayHello( 'a', 1 ),
r: new that.SayHello( 'b', 2 ),
b: new that.SayHello( 'c', 3 ),
l: new that.SayHello( 'd', 4 )
};
}(App));
问题:我正在尝试创建一个"快捷方式"来new that.SayHello
如下:
var Greet = function(){
return new that.SayHello;
},
obj = {
t: Greet( 'a', 1 ),
r: Greet( 'b', 2 ),
b: Greet( 'c', 3 ),
l: Greet( 'd', 4 )
};
控制台记录 4 个空数组。Wich意味着arguments
未能通过。
我也尝试了return new that.SayHello.apply(this, arguments);
和return new that.SayHello.call(this, arguments);
.
如何将所有Greet
的arguments
传递给that.SayHello
?
知道我必须使用 new that.SayHello
初始化that.SayHello
否则我的代码会损坏。
我正在寻找任何数量的arguments
的通用解决方案,我不想一一传递arguments
。
此代码也可以在 jsfiddle 上使用。
像这样的东西?
var Greet = function(){
var result = that.SayHello.prototype;
that.SayHello.apply(result, arguments);
return result;
}
您应该知道apply
适用于对象result
arguments
。将result
预定义为SayHello
原型将为您提供所需的内容。
编辑
不幸的是,上面的代码会改变SayHello
的原型。这显然是不需要的行为,因此为了避免这种情况,我认为我们应该复制原型对象。例如,使用以下代码
function clone(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}
var Greet = function(){
var result = clone(that.SayHello.prototype);
that.SayHello.apply(result, arguments);
return result;
}
我在这个答案中找到了clone
函数的简单版本。它有很多问题,您应该检查其他答案。例如,使用jQuery的$.extend({},originalObject)
可能是一个好主意。
请注意,如果您不关心原型链接(尽管您应该这样做),您可以随时执行以下非常简单的操作:
var Greet = function(){
var result = {};
that.SayHello.apply(result, arguments);
return result;
}
如果你不关心较旧的浏览器(ECMAScript 5),那么你可以使用Object.create
方法:
var Greet = function(){
var result = Object.create(that.SayHello.prototype);
that.SayHello.apply(result, arguments);
return result;
}