构造函数调用的快捷方式



下面是我的应用程序的简化版本,以下代码按预期工作。我可以在控制台中看到 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);.

如何将所有Greetarguments传递给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;
}

最新更新