Как я могу использовать массив для создания новых объектов, не вызывая их немедленно? - PullRequest
0 голосов
/ 02 октября 2019

Я новичок в программировании и работаю над небольшой викториной. Я использую конструктор для создания объекта, представляющего план вопроса. Я хочу, чтобы объект содержал «решение» и «возможные ответы» на вопрос. Возможные ответы я храню в массиве объектов. Массив содержит все новые объекты и отлично работает при тестировании в консоли. (Но не работает должным образом при запуске скрипта).

Итак, проблема в том, что в моем массиве я создаю новый объект, но он немедленно вызывается на консоль. Я не хочу, чтобы массив автоматически выводился на консоль. Поскольку это нужно для игры, я хочу напечатать вопрос только по запрошенному индексу. Но он печатает весь массив на консоль без вызова.

(Возможно, это как-то связано со стеком выполнения, но мне нужна помощь в выяснении этого. Я очень новичок в программировании, поэтому, пожалуйста, будьте в курсе).

var questionList = [
new Question('is learning hard?', ['yes', 'no'], 'no'),
new Question('Is JavaScript a fun programming language?', ['yes','no'], 'yes'),];

var pickQuestion = Math.floor(Math.random() * 2);
console.log(questionList[pickQuestion].ask);


//Question class (below):

var Question = function(question, answers, correct_answer) {
  this.question = question;
  this.answers = answers;
  this.correct_answer = correct_answer;
  ask: {
    console.log(this.question);
    for(var i = 0; i < answers.length; i++){
      console.log(i + ": " + answers[i]);
    }
  }
}

Ответы [ 2 ]

1 голос
/ 02 октября 2019

Это потому, что свойство ask неправильно определено как функция.

var Question = function(question, answers, correct_answer) {
  this.question = question;
  this.answers = answers;
  this.correct_answer = correct_answer;
  this.ask = () => {    // note the brackets & arrow, could also be function()
    console.log(this.question);
    for(var i = 0; i < answers.length; i++){
      console.log(i + ": " + answers[i]);
    }
  }
}
0 голосов
/ 02 октября 2019

Ваше определение класса нуждается в некоторой работе. Чтобы добавить метод, стандартным способом является добавление его к прототипу конструктора подобно Question.prototype.ask = function() {...} или определение его как метода с использованием нового JS class*Синтаксис 1008 * (это все еще добавляет его к прототипу). В противном случае, если вы создадите новую функцию внутри конструктора, вы создадите новую функцию для каждого Question. Это будет работать, но это не очень хорошая практика (в большинстве случаев), поскольку вам нужна только одна функция. Следующие фрагменты должны работать в основном так, как ожидалось, и будут лучше, чем установка функции внутри конструктора:

«Старый» JS (с использованием prototype):

function Question(question, correctAnswer, answers) {
  this.question = question;
  this.answers = answers;
  this.correctAnswer = correctAnswer;
}
Question.prototype.ask = function() {
  console.log(this.question);
  for (let i = 0; i < this.answers.length; i++) {
    console.log(i + ": " + this.answers[i]);
  }
};

function pickQuestion(q) {
  return q[
    Math.floor(Math.random() * q.length)
  ];
}

var question = pickQuestion([
  new Question('Choose Answer 1', 1, [
    'Answer 1',
    'Answer 2',
    'Answer 3'
  ]),
  new Question('Choose Answer 3', 3, [
    'Answer 1',
    'Answer 2',
    'Answer 3',
  ]),
  new Question('Choose Answer 2', 2, [
    'Answer 1',
    'Answer 2',
    'Answer 3',
  ])
]);

question.ask();

«Новый» JS (с использованием class и другими функциями):

class Question {
  constructor(question, correctAnswer, answers) {
    this.question = question
    this.answers = answers
    this.correctAnswer = correctAnswer
  }

  ask() {
    console.log(this.question)
    for (let i = 0; i < this.answers.length; i++) {
      console.log(i + ": " + this.answers[i])
    }
  }
}

const pickQuestion = q => q[
  Math.floor(Math.random() * q.length)
]

const question = pickQuestion([
  new Question('Choose Answer 1', 1, [
    'Answer 1',
    'Answer 2',
    'Answer 3'
  ]),
  new Question('Choose Answer 3', 3, [
    'Answer 1',
    'Answer 2',
    'Answer 3',
  ]),
  new Question('Choose Answer 2', 2, [
    'Answer 1',
    'Answer 2',
    'Answer 3',
  ]),
])

question.ask()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...