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

后端 未结 30 2708
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条回答
  •  旧巷少年郎
    2020-11-22 01:05

    Here is my version of createSomething:

    function createSomething() {
        var obj = {};
        obj = Something.apply(obj, arguments) || obj;
        obj.__proto__ = Something.prototype; //Object.setPrototypeOf(obj, Something.prototype); 
        return o;
    }
    

    Based on that, I tried to simulate the new keyword of JavaScript:

    //JavaScript 'new' keyword simulation
    function new2() {
        var obj = {}, args = Array.prototype.slice.call(arguments), fn = args.shift();
        obj = fn.apply(obj, args) || obj;
        Object.setPrototypeOf(obj, fn.prototype); //or: obj.__proto__ = fn.prototype;
        return obj;
    }
    

    I tested it and it seems that it works perfectly fine for all scenarios. It also works on native constructors like Date. Here are some tests:

    //test
    new2(Something);
    new2(Something, 1, 2);
    
    new2(Date);         //"Tue May 13 2014 01:01:09 GMT-0700" == new Date()
    new2(Array);        //[]                                  == new Array()
    new2(Array, 3);     //[undefined × 3]                     == new Array(3)
    new2(Object);       //Object {}                           == new Object()
    new2(Object, 2);    //Number {}                           == new Object(2)
    new2(Object, "s");  //String {0: "s", length: 1}          == new Object("s")
    new2(Object, true); //Boolean {}                          == new Object(true)
    

提交回复
热议问题