0

下面是我的App的简化版本,以下代码按预期工作。我可以在控制台中看到 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 个空数组。这意味着arguments未能通过。

我也试过return new that.SayHello.apply(this, arguments);return new that.SayHello.call(this, arguments);

我怎样才能将 ALL 传递给Greetargumentsthat.SayHello
知道我必须初始化that.SayHellousingnew that.SayHello否则我的代码会中断。

我正在寻找任何数量的通用解决方案arguments,我不想arguments一个一个地通过。

此代码也可在jsfiddle上找到。

4

1 回答 1

1

像这样的东西?

var Greet = function(){
    var result = that.SayHello.prototype;
    that.SayHello.apply(result, arguments);
    return result;
}

您应该知道这apply适用arguments于 object result。预定义resultSayHello原型会给你你想要的。

编辑

不幸的是,上面的代码会改变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;
}
于 2012-04-06T13:27:30.147 回答