Maison > interface Web > js tutoriel > Le « nouvel » opérateur JavaScript peut-il fonctionner avec la méthode « .apply() » ?

Le « nouvel » opérateur JavaScript peut-il fonctionner avec la méthode « .apply() » ?

Barbara Streisand
Libérer: 2024-12-17 09:31:25
original
343 Les gens l'ont consulté

Can JavaScript's `new` Operator Work with the `.apply()` Method?

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
Copier après la connexion

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);
    }
})();
Copier après la connexion

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));
}
Copier après la connexion

Cela peut être utilisé comme suit :

var s = newCall(Something, a, b, c);
Copier après la connexion

Avantages de l'utilisation Function.prototype.bind

Cette approche présente plusieurs avantages :

  • Elle fonctionne avec tous les constructeurs, y compris les constructeurs spéciaux comme Date.
  • Cela peut être utilisé de manière concise, en passant directement les arguments à new.
  • Il préserve le constructeur d'origine prototype.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal