Javascript 构造函数调用的快捷方式

Javascript 构造函数调用的快捷方式,javascript,Javascript,下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到4个日志,其中包含我传递给SayHello的参数 var App = {}; (function(that){ that.SayHello = function(){ console.log( arguments ); return { doSomething: function(){ console.log('done');

下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到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));
问题:我正在尝试创建一个新的
的“快捷方式”。如下所示:

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我的答案中有一个主要错误,我已经更新了。