Javascript 构造函数调用的快捷方式
下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到4个日志,其中包含我传递给Javascript 构造函数调用的快捷方式,javascript,Javascript,下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到4个日志,其中包含我传递给SayHello的参数 var App = {}; (function(that){ that.SayHello = function(){ console.log( arguments ); return { doSomething: function(){ console.log('done');
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));
问题:我正在尝试创建一个新的的“快捷方式”。如下所示:
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表示参数
未能通过
我还尝试了返回新的thay.SayHello.apply(this,arguments)
和返回新的thay.SayHello.call(this,arguments)代码>
如何将所有问候的参数传递给那个。SayHello
?
知道我必须使用new that.SayHello
初始化that.SayHello
,否则我的代码会中断
我正在为任何数量的参数
寻找通用解决方案,我不想逐个传递参数
此代码也可在上找到。类似于此的内容
var Greet = function(){
var result = that.SayHello.prototype;
that.SayHello.apply(result, arguments);
return result;
}
您应该知道apply
将参数
应用于对象结果
。将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;
}
@Pierre我的答案中有一个主要错误,我已经更新了。