Search code examples
javascriptobjectprototype

Programmatically create a new object


I am trying to create a function which will take arguments arg1, arg2... then pass them into a constructor for a new object C like so: new C(arg1, arg2...), so to make a new instance of C the user would simply have to call C(arg) instead of new C(arg). Here is my first attempt:

var C = function(a){ this.a = a; }

var Cn = function(){
    new C.apply(this, arguments);
}

Cn(0)     // Should make a new C with a property a equal to 0
new C(0)  // ie the same as this

Edit: Note, I need it to take an arbitrary number of arguments and not use eval. I'm making a library implementing Algebraic Data Types in js.


Edit: The solution was to take Jeremy's Idea and adapt it to take an unbounded number of arguments:

var C = function() {

    // A unique object so we can identify when we used the 'newless' constructor
    var newlessConstructorObj = {}

    // Check to see if C has been called with `new`
    if(!(this instanceof C))
        // If not pass arguments as single arg back to C
        return new C(newlessConstructorObj, arguments);


    // Check to see if we got here from the line above, if so the arguments were passed in the second arg
    var args = (arguments[0] === newlessConstructorObj) ? arguments[1] : arguments

    // Do stuff with args
    this.a = args[0];
}

C(0);
new C(0);

Solution

  • If you want to be able to call the function with or without the new keyword, you have to follow this pattern:

    C = function(a) {
      if (!(this instanceof C)) {
        return new C(a);
      }
    
      this.a = a;
    }
    

    so to create a new instance of "C":

    c = new C(a);
    

    and

    c = C(a);
    

    will both return a properly formed instance of C