Maison >interface Web >js tutoriel >Comment puis-je transmettre dynamiquement des arguments à un constructeur à l'aide du « nouvel » opérateur en JavaScript ?

Comment puis-je transmettre dynamiquement des arguments à un constructeur à l'aide du « nouvel » opérateur en JavaScript ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-04 10:58:111019parcourir

How Can I Dynamically Pass Arguments to a Constructor Using the `new` Operator in JavaScript?

Surmonter les limites de la méthode Apply() avec le nouvel opérateur

En JavaScript, la méthode apply() permet de transmettre un nombre arbitraire d'arguments sous forme de tableau à une fonction prédéfinie, étendant potentiellement ses fonctionnalités. Cependant, couplée à l'opérateur new, essentiel pour l'instanciation d'objet, cette approche présente un défi unique : le constructeur attend généralement un nombre fixe d'arguments.

Ma question est née du désir de créer une instance d'objet. en utilisant l'opérateur new tout en fournissant dynamiquement des arguments au constructeur.

L'obstacle :

Au départ, j'ai cherché pour mettre en œuvre ce concept :

function Something(){
    // Initializations
}
function createSomething(){
    return new Something.apply(null, arguments);
}
var s = createSomething(a,b,c); //'s' is an instance of Something

Cependant, cette approche s'est avérée inefficace.

Résoudre le problème :

De nombreuses solutions ont été proposées en réponse à ma requête, mais aucune n'offrait une intégration transparente de apply() avec le nouvel opérateur. Des solutions alternatives ont été suggérées, chacune avec ses propres avantages et mises en garde.

Solution préférée :

La solution qui m'a le plus plu, proposée par Matthew Crumley, employait une solution intelligente approche utilisant Function.prototype.bind et une fonction intermédiaire :

var createSomething = (function() {
    function F(args) {
        return Something.apply(this, args);
    }
    F.prototype = Something.prototype;

    return function() {
        return new F(arguments);
    }
})();

Cette approche évite apply() et utilise un fonction, F, qui implémente la fonctionnalité prévue.

Une autre option viable :

Une autre solution notable, proposée par Simon Lyall, exploite Function.prototype.bind et eval( ):

function createSomething(){
  var args = [].slice.call(arguments),
      constr = eval("new ("+Something.name+"(" + args+ "))");
  return constr;
}

Bien qu'élégante et concise, cette approche s'appuie sur eval(), ce qui peut soulever des problèmes de sécurité et de compatibilité. dans différents environnements.

Conclusion :

Bien que la méthode apply() fournisse un moyen puissant de gérer un nombre dynamique d'arguments, son intégration directe avec l'opérateur new reste non pris en charge en JavaScript. Au lieu de cela, des solutions alternatives sont disponibles pour obtenir des fonctionnalités similaires, permettant la création flexible d'instances d'objet avec différents arguments.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn