Wskaźnik this w zdarzeniach javascript

0

Czy jest możliwość zmiany "wskaźnika" this w trakcie działania skryptu ? Kod jest częścią skryptu obsługującego grę w chińczyka.

this.move = function(pawnID, squareID, idPlayer){
        var pawn = player.arr[idPlayer].arr[pawnID];
        var square = plane.arrSquare[squareID];

        pawn.setSquare(square);
        console.log("pawn: " + pawn.id + " position: " + pawn.getSquare().id);
    };
    
    var move = this.move;
    
    this.yourTurn = function(pawnID, idPlayer){
        var sID = player.arr[idPlayer].arr[pawnID].getSquare().id + cube.newRandom();
        var squareID = sID < 31 ? sID : sID % 31;

        move(pawnID, squareID, idPlayer);
        
    };

Funkcja yourTurn jest wywoływana zdarzeniem naciśnięcia przycisku na stronie. Wywołanie funkcji move poprzez this.move było niemozliwe, ponieważ this odnosiło się do buttona. Obszedłem to przez stworzenie zmiennej "move" dostępnej tylko w środowisku konstruktora. Inaczej mówiąc zmieniłem

this.move(pawnID, squareID, idPlayer);

na

move(pawnID, squareID, idPlayer);

Tworząc wcześniej zmienną move poprzez:

 var move = this.move;

Czy istnieje jakieś zgrabniejsze obejście tego problemu ?

5

Użyj arrow function.

1

Tak jak kolega wyżej wspomniał. Ale poczytaj o bind, apply, call. Powinieneś to umieć poruszając się jsem.

2

Ja zawsze rozwiązuje to w ten sposób:

var Some = function() {
    var self = this;
    var priv = {}; // opcjonalnie tutaj wrzucasz metody/atrybuty prywatne

    self.move = function() {
        alert('move');
    };

    self.yourTurn = function() {
        alert('yourTurn');
        self.move();
    }

    return self;
};
2
// uzyj arrow function (najlepsze wyjście)
this.yourTurn = (pawnID, idPlayer) => {
    // ...
    this.move(pawnID, squareID, idPlayer);
};

// troche brzydkie wyjście
this.yourTurn = function (pawnID, idPlayer) {
    // ...
    this.move(pawnID, squareID, idPlayer);
}.bind(this);

// wyjście w stylu vintage
var _this = this;
this.yourTurn = function (pawnID, idPlayer) {
    // ...
    _this.move(pawnID, squareID, idPlayer);
}
1
Markuz napisał(a):

Ja zawsze rozwiązuje to w ten sposób:

var Some = function() {
    var self = this;
    var priv = {}; // opcjonalnie tutaj wrzucasz metody/atrybuty prywatne

    self.move = function() {
        alert('move');
    };

    self.yourTurn = function() {
        alert('yourTurn');
        self.move();
    }

    return self;
};

Tego nie czaję - jeśli to funkcja-konstruktor, to po co tam return? Jak chcesz zrobić fabrykę to możesz w ogóle wywalić this:

const Some = () => {
  const priv = {}
  const pub = {}
  
  pub.move = () => {
    console.log('move');
  };

  pub.yourTurn = () => {
    console.log('yourTurn');
    pub.move();
  }

  return pub
}
0

Brak podstaw się kłania. Nie ma w tym nic złego, każdy przez to przechodził pewnie - ale jednak w KAŻDYM bardziej zorganizowanym kursie/podręczniku o JS znajdziesz odpowiedzi na twoje pytania https://github.com/getify/You-Dont-Know-JS/tree/master/this%20%26%20object%20prototypes

Programować "na pałę" to można na krótką metę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1