Я пытаюсь передать переменную методу в объекте, но постоянно получаю сообщение об ошибке this.phrase не повторяется
Я использую два объекта и передаю эту переменную из одного объекта в другой.
Класс фразы
console.clear()
class Phrase {
constructor(phrase) {
console.info("Phrase constructor")
this.phrase = phrase;
}
addPhraseToDisplay() {
console.info("Phrase addPhraseToDisplay")
let arr = [...this.phrase];
arr.forEach(letter => {
let li = $(`<li>${letter}</li>`);
if (letter !== ' ') {
li.addClass(`hide letter ${letter}`);
$('#phrase ul').append(li);
} else {
let li = $(`<li>${letter}</li>`);
li.addClass('hide space');
$('#phrase ul').append(li);
}
return letter;
});
}
}
class Game {
constructor() {
console.info("Game constructor")
this.missed = 0;
//directly put the phrases in the constructor
this.phrases = [new Phrase("hello world"),
new Phrase("Wolf on wall street"),
new Phrase("Despite making"),
new Phrase("Karen took the kids"),
new Phrase("alright about to head out")
];
this.activePhrase = null;
}
getRandomPhrase() {
console.info("Game getRandomPhrase()")
//returns 5 of the random phrases
return this.phrases[Math.floor(Math.random() * this.phrases.length)];
}
startGame() {
console.info("Game startGame")
let hid = document.getElementById('overlay');
hid.style.display = "none";
let phrs = this.getRandomPhrase();
let stor = new Phrase(phrs);
stor.addPhraseToDisplay();
}
}
g = new Game()
g.startGame()<div id = "overlay"></div>Что мне не хватает?
Предположительно, это потому, что phrs в startGame — это объект, который вы затем пытаетесь распространить с помощью [...this.phrase]…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваша ошибка заключалась в том, что вы создали новую фразу из фразы с этим
let stor = new Phrase(phrs);
избавься от этого и все заработает
console.clear()
class Phrase {
constructor(phrase) {
console.info("Phrase constructor")
this.phrase = phrase;
}
addPhraseToDisplay() {
console.info("Phrase addPhraseToDisplay")
let arr = [...this.phrase];
arr.forEach(letter => {
let li = $(`<li>${letter}</li>`);
if (letter !== ' ') {
li.addClass(`hide letter ${letter}`);
$('#phrase ul').append(li);
} else {
let li = $(`<li>${letter}</li>`);
li.addClass('hide space');
$('#phrase ul').append(li);
}
return letter;
});
}
}
class Game {
constructor() {
console.info("Game constructor")
this.missed = 0;
//directly put the phrases in the constructor
this.phrases = [new Phrase("hello world"),
new Phrase("Wolf on wall street"),
new Phrase("Despite making"),
new Phrase("Karen took the kids"),
new Phrase("alright about to head out")
];
this.activePhrase = null;
}
getRandomPhrase() {
console.info("Game getRandomPhrase()")
//returns 5 of the random phrases
return this.phrases[Math.floor(Math.random() * this.phrases.length)];
}
startGame() {
console.info("Game startGame")
let hid = document.getElementById('overlay');
hid.style.display = "none";
let phrs = this.getRandomPhrase();
//let stor = new Phrase(phrs);
phrs.addPhraseToDisplay();
}
}
g = new Game()
g.startGame()<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "phrase"><ul></ul></div>
<div id = "overlay"></div>console.clear()
class Phrase {
constructor(phrase) {
this.phrase = phrase;
}
}
class Game {
constructor() {
this.missed = 0;
//directly put the phrases in the constructor
this.phrases = [new Phrase("hello world"),
new Phrase("Wolf on wall street"),
new Phrase("Despite making"),
new Phrase("Karen took the kids"),
new Phrase("alright about to head out")
];
this.activePhrase = null;
}
getRandomPhrase() {
//returns 5 of the random phrases
return this.phrases[Math.floor(Math.random() * this.phrases.length)];
}
startGame() {
let hid = document.getElementById('overlay');
hid.style.display = "none";
let phrs = this.getRandomPhrase();
this.addPhraseToDisplay(phrs);
}
addPhraseToDisplay(phrs) {
let arr = [...phrs.phrase];
arr.forEach(letter => {
let li = $(`<li>${letter}</li>`);
if (letter !== ' ') {
li.addClass(`hide letter ${letter}`);
$('#phrase ul').append(li);
} else {
let li = $(`<li>${letter}</li>`);
li.addClass('hide space');
$('#phrase ul').append(li);
}
return letter;
});
}
}
g = new Game()
g.startGame()<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "phrase"><ul></ul></div>
<div id = "overlay"></div>Вот еще один способ решить эту проблему. Вы получали ошибку из-за этих строк:
let phrs = this.getRandomPhrase(); // phrs is an instance of Phrase
let stor = new Phrase(phrs); // stor is new Phrase(new Phrase(...))
stor.addPhraseToDisplay();
В вашем коде phrs уже является экземпляром Phrase. Поэтому вы объявили stor как new Phrase(new Phrase(/* some string */)). Ошибка возникает из-за использования синтаксиса распространения на входе конструктора stor.addPhraseToDisplay. Это прекрасно работает, когда вход представляет собой Phrase, но вы используете синтаксис распространения для экземпляра String, который не является итерируемым; например, Phrase.
Просто удалите [...new Phrase('abc')] вызовы конструктора из Phrase и вместо этого реализуйте его как массив строк; то ошибка больше не возникает:
console.clear()
class Phrase {
constructor(phrase) {
console.info("Phrase constructor")
this.phrase = phrase;
}
addPhraseToDisplay() {
console.info("Phrase addPhraseToDisplay")
let arr = [...this.phrase];
arr.forEach(letter => {
let li = $(`<li>${letter}</li>`);
if (letter !== ' ') {
li.addClass(`hide letter ${letter}`);
$('#phrase ul').append(li);
} else {
let li = $(`<li>${letter}</li>`);
li.addClass('hide space');
$('#phrase ul').append(li);
}
return letter;
});
}
}
class Game {
constructor() {
console.info("Game constructor")
this.missed = 0;
//directly put the phrases in the constructor
this.phrases = [
"hello world",
"Wolf on wall street",
"Despite making",
"Karen took the kids",
"alright about to head out"
];
this.activePhrase = null;
}
getRandomPhrase() {
console.info("Game getRandomPhrase()")
//returns 5 of the random phrases
return this.phrases[Math.floor(Math.random() * this.phrases.length)];
}
startGame() {
console.info("Game startGame")
let hid = document.getElementById('overlay');
hid.style.display = "none";
let phrs = this.getRandomPhrase();
let stor = new Phrase(phrs);
stor.addPhraseToDisplay();
}
}
g = new Game()
g.startGame()<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "phrase"><ul></ul></div>
<div id = "overlay"></div>
Как вы называете классы?