Can the .apply() Method Be Used with the new Operator?
In JavaScript, creating an object instance using the new operator typically involves explicitly passing arguments to the constructor. However, it might be desirable to pass a variable number of arguments instead. This question explores the possibility of utilizing the .apply() method in conjunction with the new operator to achieve this flexibility.
The Challenge
Initially, one might attempt the following code:
function Something() { // init stuff } function createSomething() { return new Something.apply(null, arguments); } var s = createSomething(a, b, c); // 's' is an instance of Something
However, this approach does not function because the new operator is incompatible with the .apply() method.
Solutions
Various solutions have been proposed to overcome this limitation:
1. Matthew Crumley's Method
This solution employs an intermediary function that inherits from the target constructor:
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
2. Function.prototype.bind
ECMAScript5 introduces the Function.prototype.bind method, which allows partially applying functions:
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
This can be used as follows:
var s = newCall(Something, a, b, c);
Advantages of Using Function.prototype.bind
This approach has several advantages:
Explanation
Function.prototype.bind creates a new function that inherits the original function's properties. By partially applying the constructor function with the desired arguments, we can then create an instance using the new keyword.
The above is the detailed content of Can JavaScript's `new` Operator Work with the `.apply()` Method?. For more information, please follow other related articles on the PHP Chinese website!