JavaScript: How to create a new instance of a class without using the new keyword?

Viewed 64749

I think the following code will make the question clear.

// My class
var Class = function() { console.log("Constructor"); };
Class.prototype = { method: function() { console.log("Method");} }

// Creating an instance with new
var object1 = new Class();
object1.method();
console.log("New returned", object1);

// How to write a factory which can't use the new keyword?
function factory(clazz) {
    // Assume this function can't see "Class", but only sees its parameter "clazz".
    return clazz.call(); // Calls the constructor, but no new object is created
    return clazz.new();  // Doesn't work because there is new() method
};

var object2 = factory(Class);
object2.method();
console.log("Factory returned", object2);
7 Answers

What you could also do is use eval.

Of course there are security concerns with eval, but is it really different to any other dynamic instanciation?

await import("/path/to/module") //use this to dynamically load module if you like
let obj = `eval new ${classname}();`
Related