2016-05-10 15 views
0

Ich arbeite an einem Programm, das ein Objekt namens "Player" hat, die aus dem Konstruktor "Schlange" erstellt wird.Javascript: "Dies" in geschachtelten Objekten

var player = { 
    x: 0, 

    sayX: function() { 
    console.log(this.x); 
    } 
} 

Dieser Code funktioniert gut. Ich möchte jedoch von einem anderen Objekt namens "ani" auf die Funktion "sayX" zugreifen.

var ani = { 
    x: 10, 

    sayAll: function() { 
    console.log(this.x); 
    player.sayX(); 
    } 
} 

Wenn ich versuche, ani.sayAll, sayX Protokolle nicht definiert laufen, weil es ein „this“ verwendet, aber ich konnte nicht angeben, welche „dieses“ wurde verweist.

Gibt es eine Möglichkeit, um dieses.

EDIT: Eigentlich ist der gesamte Code in einem anderen Objekt. Hätte das etwas damit zu tun?

+2

[funktioniert gut für mich.] (Https://jsfiddle.net/qbmq2td2/) müssen Sie etwas anderes zu tun werden. –

+0

Wenn Sie 'player.sayX();' aufrufen, bezieht sich 'this' auf' player'. Werfen Sie einen Blick auf die [MDN-Dokumentation zu 'this'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this). –

+0

player.sayX() funktioniert korrekt, aber wenn ich es innerhalb von ANI ausführe, protokolliert es undefined. – Polygon

Antwort

-1

Machen Sie das 'sayX' Funktion wie folgt aus:

sayX: function() { 
    console.log(player.x); 
} 

und machen die 'sayAll' Funktion wie folgt aus:

sayAll: function() { 
    console.log(ani.x); 
    player.sayX(); 
} 

diese Arbeiten sollen.

+1

Während dies funktionieren kann, ist nichts falsch mit dem Code, den das OP hat, also warum es ändern? Dies ist eher ein Workaround als eine richtige Lösung für das Problem. –

+0

Das funktioniert. Ich möchte jedoch die Möglichkeit haben, mehrere "Spieler" -Objekte zu erstellen, und das funktioniert nur, wenn es nur einen gibt. – Polygon

+0

Ich denke, wenn ich 'this' Schlüsselwort innerhalb einer Funktion verwende, beziehe ich mich auf die Funktion und nicht auf die Elternfunktion. –

1

sayX kehrt undefined

Die Funktion richtig läuft, aber Sie nichts in sayAll zurückkehren, also warum es Rückkehrundefined ing.

var player = { 
    x: 0, 
    sayX: function() { 
    console.log(this.x); 
    return 'anything'; 
    } 
}; 

var ani = { 
    x: 10, 
    sayAll: function() { 
    console.log(this.x); 
    return player.sayX(); 
    } 
}; 

ani.sayAll(); // logs '10', then '0', and returns 'anything'; 

Probe Screenshot:

Code when run in Chrome dev tools

+0

Hoppla! Das war ein Tippfehler. Ich wollte sagen "Logs" – Polygon

+0

@Polygon, ich bekomme dieses Ergebnis nicht, wenn ich den Code in Chrome Devtools (siehe Screenshot hinzugefügt). Welchen Browser/welche Umgebung verwenden Sie, wo Sie ein anderes Ergebnis erhalten? – romellem

Verwandte Themen