Heim >Web-Frontend >js-Tutorial >Wie kann ich mithilfe des „new'-Operators in JavaScript dynamisch Argumente an einen Konstruktor übergeben?

Wie kann ich mithilfe des „new'-Operators in JavaScript dynamisch Argumente an einen Konstruktor übergeben?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-04 10:58:111034Durchsuche

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

Überwindung der Grenzen der Apply()-Methode mit dem neuen Operator

In JavaScript ermöglicht die apply()-Methode die Übergabe einer beliebigen Anzahl von Argumenten als Array zu einer vordefinierten Funktion hinzufügen und so möglicherweise deren Funktionalität erweitern. In Verbindung mit dem neuen Operator, der für die Instanziierung von Objekten unerlässlich ist, stellt dieser Ansatz jedoch eine einzigartige Herausforderung dar: Der Konstruktor erwartet typischerweise eine feste Anzahl von Argumenten.

Meine Frage entstand aus dem Wunsch, eine Objektinstanz zu erstellen Verwendung des neuen Operators bei gleichzeitiger dynamischer Bereitstellung von Argumenten für den Konstruktor.

Das Hindernis:

Zunächst Ich habe versucht, dieses Konzept umzusetzen:

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

Dieser Ansatz erwies sich jedoch als wirkungslos.

Lösung des Problems:

Es wurden zahlreiche Lösungen vorgeschlagen Antwort auf meine Anfrage, aber keine bot eine nahtlose Integration von apply() mit dem neuen Operator. Es wurden alternative Lösungen vorgeschlagen, jede mit ihren eigenen Vorteilen und Einschränkungen.

Bevorzugte Lösung:

Die von Matthew Crumley vorgeschlagene Lösung, die bei mir am meisten Anklang fand, verwendete einen cleveren Ansatz mit Function.prototype.bind und einer Zwischenfunktion:

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

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

Dieser Ansatz verzichtet auf apply() und verwendet eine separate Funktion. F, das die beabsichtigte Funktionalität implementiert.

Eine weitere praktikable Option:

Eine weitere bemerkenswerte Lösung, angeboten von Simon Lyall, nutzt Function.prototype.bind und eval():

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

Obwohl dieser Ansatz elegant und prägnant ist, basiert er auf eval(), was Bedenken hinsichtlich der Sicherheit und Kompatibilität verschiedener Systeme aufwerfen kann Umgebungen.

Schlussfolgerung:

Obwohl die apply()-Methode eine leistungsstarke Möglichkeit bietet, eine dynamische Anzahl von Argumenten zu verarbeiten, wird ihre direkte Integration mit dem neuen Operator weiterhin nicht unterstützt JavaScript. Stattdessen stehen alternative Lösungen zur Verfügung, um eine ähnliche Funktionalität zu erreichen und die flexible Erstellung von Objektinstanzen mit unterschiedlichen Argumenten zu ermöglichen.

Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe des „new'-Operators in JavaScript dynamisch Argumente an einen Konstruktor übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn