Élargissement des capacités de .apply() avec le « nouvel » opérateur
En JavaScript, la méthode .apply() permet une fonction à appeler avec un contexte d'objet spécifié et des arguments passés sous forme de tableau. Cependant, la question se pose : .apply() peut-il être utilisé conjointement avec l'opérateur 'new' pour créer une instance d'objet ?
L'extrait de code initial que vous avez fourni a tenté de le faire, mais malheureusement, cette approche est non pris en charge nativement en JavaScript.
Cependant, plusieurs solutions intelligentes ont été proposées pour surmonter cette limitation. Une approche particulièrement élégante consiste à utiliser Function.prototype.bind dans ECMAScript5 :
function newCall(Cls) { return new (Function.prototype.bind.apply(Cls, arguments)); }
Cette fonction accepte une classe ou un constructeur comme premier argument, ainsi que tous les arguments supplémentaires qui doivent être transmis au constructeur. Il utilise ensuite Function.prototype.bind pour créer une nouvelle fonction qui a le même contexte que le constructeur et les arguments supplémentaires pré-liés. Enfin, le mot-clé 'new' est utilisé pour créer une nouvelle instance d'objet basée sur cette fonction liée.
Une autre solution possible consiste à utiliser la fonction eval() :
function evalConstructor(str, args) { return eval('new (' + str + ')(' + args + ')'); }
Cette fonction prend une expression de chaîne représentant le constructeur et un tableau d'arguments, puis évalue cette chaîne en tant qu'expression JavaScript. Le code résultant est essentiellement le même que l'utilisation directe de l'opérateur new, mais il vous permet de transmettre un nombre variable d'arguments.
Ces solutions offrent des moyens pratiques de créer des instances d'objet avec un nombre variable d'arguments, améliorant ainsi la fonctionnalité du mécanisme de constructeur de JavaScript.
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!