View for logging telephone calls
Object literals
By the looks this is client side UI only and the actual results are stored in the database.
Your concern is not that of the data structure, but rather one of representation.
The task is defined by what you have in createAnswerSelect(validAnswers) {
Your code is attempting to imitate a higher level abstraction unrelated to the task you need to complete. This has forced you to presented 4 additional interfaces to the scope you are working in  Answer, UnansweredState, ValidAnswerState, InvalidAnswerState that you are unsure of.
Javascript lets you define objects as literals, you can side step the noise related to defining named Objects, Prototypes, functions, calls to super etc, yet still keep the same underlying relationship of shared and unique state.
Example
The best code is that which does it quickly and as simply as possible. Creating an inherited structure just to hold some shared and unique states is too complex.
This example is an alternative (based on the information you have provided)
It defines the 3 states as named constants that access state information via a Map of named states, rather than the 3 objects you defined UnansweredState, ValidAnswerState, InvalidAnswerState
const UNANSWERED = 1;
const INVALID = 2;
const VALID = 3;

const createElement = (type, opts = {}) =&gt; Object.assign(document.createElement(type), opts);
const common = (icon, color) =&gt; ({icon, color});
const states = new Map([
  [UNANSWERED, {...common(&quot;remove&quot;, &quot;grey&quot;), data: {unanswered: &quot;&quot;}}],
  [INVALID, {...common(&quot;clear&quot;, &quot;red&quot;), data: {valid: &quot;&quot;, icon: &quot;icons/round-done-24px.svg&quot;}}],
  [VALID, {...common(&quot;done&quot;, &quot;green&quot;), data: {invalid: &quot;&quot;, icon: &quot;icons/round-clear-24px.svg&quot;}}],
]);
const option = (answer, stateId) =&gt; {
  const state = states.get(stateId);
  const option = createElement(&quot;option&quot;, {value: answer, textContent: answer });
  Object.assign(option.dataset, state.data);
  option.dataset.validationIcon = state.icon;
  option.dataset.validationColor = state.color;   
  return option;
}        

function createAnswerSelect(answers) {
  const select = createElement('select');
  select.add(option(&quot;Unanswered&quot;, UNANSWERED));
  answers.forEach(answer =&gt; select.add(option(answer.answer, VALID)) );
  select.add(option(&quot;Incorrect response&quot;, INVALID));
  return select;           
}          
export { createAnswerSelect };