Два класса, один со ссылкой на функцию, другой это значение отличается - PullRequest
1 голос
/ 16 февраля 2020

У меня проблема, и я не знаю, как ее решить:

        this.bWords.push(word);
                    ^

TypeError: Невозможно прочитать свойство 'pu sh' из неопределенного

, вот мой код:

function multiWords(words) {
    class AWords {
        constructor(words = []) {
            this.words = words;
            this.addWordFn = () => {};
        }

        setAddWordFn(fn) {
            this.addWordFn = fn;
        }

        passWords() {
            this.words.forEach(word => this.addWordFn(word));
        }
    }

    class BWords {
        constructor() {
            this.bWords = [];
        }

        addWord(word) {
            this.bWords.push(word);
        }
    }

    let x = new AWords(words);
    let y = new BWords();

    x.setAddWordFn(y.addWord);
    x.passWords();

    return y.bWords;
}


console.log(multiWords(["one", "two", "three"]));

У вас есть идеи, почему существует другое значение this? Большое спасибо Пати

1 Ответ

1 голос
/ 16 февраля 2020

Похоже, что проблема возникает здесь:

this.words.forEach(word => this.addWordFn(word));

, потому что функция, которую вы установили для addWordFn здесь:

x.setAddWordFn(y.addWord);

Требуется другое значение this чем вы это называете. Вы можете исправить это, привязав правильное значение этого к вашему обратному вызову:

x.setAddWordFn(y.addWord.bind(y));

Помните, что для обычных функций значение this внутри функции определяется тем, как вызывается функция. Когда вы вызываете функцию с помощью obj.method(), значение this внутри method() будет установлено на obj. Итак, вы вызываете addWord с неправильным значением this, потому что вы сделали его методом какого-то другого объекта (который также не имеет необходимых данных) и вызываете его из этого объекта.

...