Heim > Web-Frontend > js-Tutorial > Wie bleibt der Kontext in JavaScript-Prototypfunktionen erhalten?

Wie bleibt der Kontext in JavaScript-Prototypfunktionen erhalten?

Susan Sarandon
Freigeben: 2024-11-04 00:21:03
Original
483 Leute haben es durchsucht

How to Preserve Context in JavaScript Prototype Functions?

Kontext in JavaScript-Prototypfunktionen bewahren: Ein umfassender Leitfaden

Viele JavaScript-Entwickler stoßen auf Herausforderungen, wenn sie versuchen, den Kontext (den Wert von „this“) zu bewahren ") innerhalb von Prototypfunktionen. Dieser Leitfaden soll ein umfassendes Verständnis dafür vermitteln, wie dieses Problem effektiv gelöst werden kann.

Im bereitgestellten Beispiel:

MyClass = function() {
  this.element = $('#element');
  this.myValue = 'something';

  // some more code
}

MyClass.prototype.myfunc = function() {
  // at this point, "this" refers to the instance of MyClass

  this.element.click(function() {
    // at this point, "this" refers to the DOM element
    // but what if I want to access the original "this.myValue"?
  });
}

new MyClass();
Nach dem Login kopieren

Das Problem tritt auf, wenn ein Ereignishandler innerhalb der Prototypfunktion definiert wird. myfunc." Während des Click-Events bezieht sich „this“ nicht mehr auf die MyClass-Instanz, sondern auf das DOM-Element.

Kontexterhaltung mit Bind

Die „bind“-Methode bietet eine einfache Lösung. Es wird eine neue Funktion erstellt, die den Kontext (diesen Wert) der ursprünglichen Funktion beibehält, auch wenn sie in einem anderen Kontext aufgerufen wird.

Durch die Verwendung von bind im Beispiel:

MyClass.prototype.myfunc = function() {

  this.element.click((function() {
    // ...
  }).bind(this));
};
Nach dem Login kopieren

Der Klick Der Ereignishandler behält den MyClass-Instanzkontext bei und ermöglicht den Zugriff auf „this.myValue“.

Zusätzliche Bindung Beispiele

var obj = {
  test: 'obj test',
  fx: function() {
    alert(this.test + '\n' + Array.prototype.slice.call(arguments).join());
  }
};

var test = "Global test";
var fx1 = obj.fx;
var fx2 = obj.fx.bind(obj, 1, 2, 3);

fx1(1,2);
fx2(4, 5);
Nach dem Login kopieren

In diesem Beispiel:

  • fx1 wird direkt aufgerufen, was zu einem globalen Kontext („globaler Test“) für „dies“ führt.
  • fx2 ist eine gebundene Funktion, die den Kontext von obj beibehält und die Argumente übergibt korrekt.

Überlegungen zur Anpassung

Wenn mehrere Prototypfunktionen eine Kontexterhaltung erfordern, kann die Erstellung einer benutzerdefinierten Bindungsfunktion erforderlich sein. Sie können eine kontextbezogene Bindungsversion für Ihre MyClass erstellen:

MyClass.prototype.myBind = function(func) {
  var context = this;
  return function() {
    func.apply(context, arguments);
  };
};
Nach dem Login kopieren

Diese benutzerdefinierte Bindungsmethode kann dann innerhalb der Prototypfunktionen verwendet werden:

MyClass.prototype.myfunc = function() {

  this.element.click(this.myBind(function() {
    // ...
  }));
};
Nach dem Login kopieren

Fazit

Die Beibehaltung des Kontexts in JavaScript-Prototypfunktionen ist entscheidend, um die ordnungsgemäße Funktionalität aufrechtzuerhalten und unerwartetes Verhalten zu vermeiden. Die „Bind“-Methode bietet eine effektive und intuitive Lösung, in komplexeren Szenarien kann jedoch eine Anpassung erforderlich sein. Wenn Sie diese Techniken verstehen, können Sie Prototypfunktionen sicher verwenden, ohne die Kontexterhaltung zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie bleibt der Kontext in JavaScript-Prototypfunktionen erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage