не может .bind контекст на функцию стрелки в методе объекта - PullRequest
0 голосов
/ 29 августа 2018

Итак, у меня есть школьный пример, но с createCardPicker: () => {}, как метод стрелки, он не работает и не видит контекст. Почему?

P.S. Мне не нужно было переписывать мой объект в любой другой презентации, просто чтобы он работал как есть. Спасибо.

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: () => {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return alert(this.suits[pickedSuit], pickedCard % 13)
        }
    }
}

deck.createCardPicker.bind(deck)()(); //undefined

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Так работает функция стрелок. Он «проходит» this на один уровень вверх.

Это будет работать так, как вы ожидаете:

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return `${this.suits[pickedSuit]} ${pickedCard % 13}`
        }
    }
}

console.log(deck.createCardPicker.bind(deck)()()); //undefined

Однако вам даже не нужно связывать это

let deck = {
    suits: ["hearts", "spades", "clubs", "diamonds"],
    cards: Array(52),
    createCardPicker: function() {
        return () => {
            let pickedCard = Math.floor(Math.random() * 52);
            let pickedSuit = Math.floor(pickedCard / 13);

            return `${this.suits[pickedSuit]} ${pickedCard % 13}`
        }
    }
}

console.log(deck.createCardPicker()()); //undefined
0 голосов
/ 29 августа 2018

Если вы используете синтаксис es6, то почему бы не создать класс Deck.

class Deck{
  constructor(){
    this.suits = ["hearts", "spades", "clubs", "diamonds"];
    this.cards = Array(52);
  }
  createCardPicker(){
    let pickedCard = Math.floor(Math.random() * 52);
    let pickedSuit = Math.floor(pickedCard / 13);
    return alert(this.suits[pickedSuit], pickedCard % 13)
  }
}

Затем вы можете создать экземпляр колоды и вызвать метод внутри:

let deck = new Deck();
deck.createCardPicker();
...