2016-07-28 23 views
0

Entschuldigung für den verwirrenden Titel, ich habe keine Ahnung, wie ich das fragen soll. Ich habe eine Frage zu Klassen und Methoden. Ich habe eine Taste, die bei Betätigung die Funktion eines anderen Objekts aufruft. In diesem Beispiel sollte "100" als f "x" in die Konsole geschrieben werden, aber stattdessen wird "0" protokolliert: "x" auf meiner Schaltfläche. Hilfe?Klassenmethode, die eine andere Klassenmethode aufruft, die als Argument gespeichert wird

<script> 
function fun(x){ 
    this.x = x; 
} 

fun.prototype = { 
    s:function(){ 
     console.log(this.x); 
    } 
} 

function Button(func){ 
    this.x = 0; 
    this.y = 0; 
    this.w = 1000; 
    this.h = 1000; 
    this.func = func; 
} 

Button.prototype = { 
    check_if_click:function(x, y){ 
     if (x >= this.x && x <= this.x + this.w && y >= this.y && y <= this.y + this.h){ 
      this.func(); 
     } 
    } 
} 

f = new fun(100); 
b = new Button(f.s); 
b.check_if_click(500, 500); 
</script> 

Antwort

1

Wenn Sie eine Funktion zu einem bestimmten Kontext binden möchten, können Sie bind verwenden. Es erstellt eine Kopie einer Funktion, bei der this auf das gesetzt ist, was auch immer Sie übergeben.

b = new Button(f.s.bind(f)); 
+0

Funktioniert perfekt, danke! –

0

this in einer Funktion gebunden ist, was Sie von ihm genannt. So fordern,

this.func(); 

ist genau das gleiche wie

b.func(); 

Aufruf was bedeutet, dass this in func wird b gebunden bekommen. Deshalb console.log(this.x) druckt 0: weil b.x0 ist.