3 Stimmen

Wie kann ich sicherstellen, dass 'this' auf das Objektliteral innerhalb des Objektliterals verweist?

Hier ist ein einfaches Beispiel.

Ich möchte sicherstellen, dass this innerhalb von obj obj ist, damit ich a von b aufrufen kann. Ich verwende obj in einer anderen Funktion, und wenn ich einen Haltepunkt innerhalb von b setze, finde ich heraus, dass this das Fenster ist, nicht obj.

var obj = {
    a: function() { return 2 },
    b: function() { return 5+ this.a() },
}

$('#hey').text(obj.b());

obj ist in einer Datei definiert, die von vielen anderen Klassen verwendet wird, daher würde es keinen Sinn ergeben, eine der Methoden auf der Site zu definieren, die obj verwenden.

Aus @Kamils Antwort zu urteilen, scheint es, dass ich a als Parameter an b übergeben muss. Wie folgt:

var user = obj.b(obj.a);

var obj = {
  a: function() { return 2 },
  b: function(func) { return 5 + func() },
}      

BEARBEITEN Das Folgende funktioniert, ist aber unübersichtlich. Gibt es eine elegantere Lösung?

Ich habe am Ende dies geändert

startingSMA = this.simple_moving_average(startingSMA, period, accessor)

zu folgendem:

startingSMA = (function(startingSMA, period, accessor) {
                 return this.simple_moving_average(startingSMA, period, accessor)                  
              }).apply(Statistics, [startingSMA, period, accessor]);

1voto

Ian Punkte 48439

Ich weiß nicht, warum dies noch nicht vorgeschlagen wurde - verwenden Sie bind:

var obj = {};
obj.b = (function () {
    // "this" wird immer "obj" sein
}).bind(obj);

Referenz:

0voto

user123444555621 Punkte 139356

Immer wenn du foo.bar() aufrufst, wird der Wert von this auf foo gesetzt. Also sehe ich kein Problem mit deinem Code.

Wenn du jedoch eine Methode indirekt aufrufst, wie zum Beispiel

var qux = foo.bar;
qux(); // keine Punkt-Notation

wird das globale Objekt zu this. Vielleicht ist das, was bei dir passiert?

Um ein bestimmtes this zu erzwingen, verwende call oder apply:

qux.call(foo);
qux.apply(foo);

0voto

Rodri_gore Punkte 2467

Seit Jquery 1.4 können Sie jQuery.proxy() verwenden und ganz einfach einen bestimmten Kontext wählen:

$('#hey').text( $.proxy(obj.b, obj) );

In diesem Fall ist der erste Parameter die Funktion, die Sie aufrufen möchten, und der zweite Parameter ist der Kontext.

Hier ist das aktualisierte Fiddle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X