En JavaScript, la construction d'une instance d'objet à l'aide du « nouveau » opérateur est généralement fait en passant directement des arguments au constructeur. Cependant, il existe des scénarios dans lesquels on pourrait souhaiter fournir des arguments de manière dynamique. Cet article aborde la question de savoir s'il est possible d'utiliser '.apply()' avec l'opérateur 'new' pour y parvenir.
Malgré son polyvalence, la méthode '.apply()' ne peut pas être directement utilisée avec l'opérateur 'new'. Toute tentative en ce sens entraînera un comportement ou des erreurs inattendus.
Reconnaissant la nécessité d'une telle fonctionnalité, diverses solutions innovantes ont été proposées par la communauté JavaScript.
Une approche, attribuée à Matthew Crumley, utilise un prototype de fonction pour créer un solution de contournement :
var createSomething = (function() { function F(args) { return Something.apply(this, args); } F.prototype = Something.prototype; return function() { return new F(arguments); } })();
Cette solution crée efficacement une nouvelle fonction avec le comportement souhaité.
'Function.prototype.bind' d'ECMAScript 5 offre une solution plus propre :
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
Cette méthode s'intègre parfaitement au « nouvel » opérateur et peut être appliquée à tous les types de constructeurs, y compris ceux ayant un comportement spécial comme « Date ».
Bien que déconseillée en raison de problèmes de sécurité potentiels, la méthode « eval » fournit une autre solution de contournement :
var s = eval("new Something(" + [a, b, c] + ")");
Ces solutions exploitent la méthode bind() pour créer une fonction qui accepte les arguments souhaités. Ensuite, l'opérateur 'new' est utilisé pour instancier un objet à partir de cette fonction.
La création d'objets avec des arguments variables à l'aide de '.apply()' et l'opérateur 'new' nécessite quelques ingéniosité. En tirant parti des fonctionnalités JavaScript disponibles, les développeurs peuvent mettre en œuvre ces techniques pour obtenir les fonctionnalités souhaitées.
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!