如何使用call或apply调用JavaScript构造函数?

22 浏览
0 Comments

如何使用call或apply调用JavaScript构造函数?

如何将下面的函数泛化为接受N个参数?(使用call或apply?)

是否有一种编程方式将参数应用于“new”?我不希望将构造函数视为普通函数。

/**
 * 这个高级函数接受一个构造函数和参数,并返回一个函数,当调用时将返回惰性构造的值。
 *
 * 除了第一个参数外,所有的参数都将传递给构造函数。
 *
 * @param {Function} constructor
 */
function conthunktor(Constructor) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function() {
        console.log(args);
        if (args.length === 0) {
            return new Constructor();
        }
        if (args.length === 1) {
            return new Constructor(args[0]);
        }
        if (args.length === 2) {
            return new Constructor(args[0], args[1]);
        }
        if (args.length === 3) {
            return new Constructor(args[0], args[1], args[2]);
        }
        throw("参数过多");
    }
}

qUnit测试:

test("conthunktorTest", function() {
    function MyConstructor(arg0, arg1) {
        this.arg0 = arg0;
        this.arg1 = arg1;
    }
    MyConstructor.prototype.toString = function() {
        return this.arg0 + " " + this.arg1;
    }
    var thunk = conthunktor(MyConstructor, "hello", "world");
    var my_object = thunk();
    deepEqual(my_object.toString(), "hello world");
});

0