Use of .apply() with 'new' operator. Is this possible?

后端 未结 30 3191
Happy的楠姐
Happy的楠姐 2020-11-22 00:39

In JavaScript, I want to create an object instance (via the new operator), but pass an arbitrary number of arguments to the constructor. Is this possible?

30条回答
  •  Happy的楠姐
    2020-11-22 01:04

    This answer is a little late, but figured anyone who sees this might be able to use it. There is a way to return a new object using apply. Though it requires one little change to your object declaration.

    function testNew() {
        if (!( this instanceof arguments.callee ))
            return arguments.callee.apply( new arguments.callee(), arguments );
        this.arg = Array.prototype.slice.call( arguments );
        return this;
    }
    
    testNew.prototype.addThem = function() {
        var newVal = 0,
            i = 0;
        for ( ; i < this.arg.length; i++ ) {
            newVal += this.arg[i];
        }
        return newVal;
    }
    
    testNew( 4, 8 ) === { arg : [ 4, 8 ] };
    testNew( 1, 2, 3, 4, 5 ).addThem() === 15;
    

    For the first if statement to work in testNew you have to return this; at the bottom of the function. So as an example with your code:

    function Something() {
        // init stuff
        return this;
    }
    function createSomething() {
        return Something.apply( new Something(), arguments );
    }
    var s = createSomething( a, b, c );
    

    Update: I've changed my first example to sum any number of arguments, instead of just two.

提交回复
热议问题