La méthode .apply() peut-elle être utilisée avec l'opérateur new ?
En JavaScript, la création d'une instance d'objet à l'aide de l'opérateur new est généralement implique de transmettre explicitement des arguments au constructeur. Cependant, il peut être préférable de transmettre un nombre variable d'arguments. Cette question explore la possibilité d'utiliser la méthode .apply() en conjonction avec le nouvel opérateur pour obtenir cette flexibilité.
Le défi
Dans un premier temps, on pourrait tenter la code suivant :
function Something() { // init stuff } function createSomething() { return new Something.apply(null, arguments); } var s = createSomething(a, b, c); // 's' is an instance of Something
Cependant, cette approche ne fonctionne pas car l'opérateur new est incompatible avec le .apply() méthode.
Solutions
Diverses solutions ont été proposées pour pallier cette limitation :
1. Méthode de Matthew Crumley
Cette solution utilise une fonction intermédiaire qui hérite du constructeur cible :
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 introduit la méthode Function.prototype.bind, qui permet d'appliquer partiellement des fonctions :
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
Cela peut être utilisé comme suit :
var s = newCall(Something, a, b, c);
Avantages de l'utilisation Function.prototype.bind
Cette approche présente plusieurs avantages :
Explication
Function.prototype.bind crée une nouvelle fonction qui hérite des propriétés de la fonction d'origine. En appliquant partiellement la fonction constructeur avec les arguments souhaités, on peut alors créer une instance à l'aide du nouveau mot-clé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!