mi código funciona con el mapa, m, hasta que lo uso en el detector de eventos haciendo clic en el botón, luego arroja un error y me dice que m.get() no es una función, sin embargo, funciona antes del evento de clic, ¿qué puede que hago para arreglar esto y ¿por qué sucede esto?
'use strict'; const poll = { question: 'What is your favourite programming language?', options: ['0: JavaScript', '1: Python', '2: Rust', '3: C++'], // This generates [0, 0, 0, 0]. More in the next section 😃 answers: new Array(4).fill(0), registerNewAnswer(m){ const answer = Number(prompt(`${this.question}\n${this.options.join('\n')}`)); answer < 4 && answer >= 0 ? answer : alert('invalid entry try again'); //console.log(answer); m.set(this.options[answer],m.get(poll.options[answer]) + 1) } } const fun = function(arr){ let narr =[]; for(let i =0;i<arr.length;i++){ let temp = []; temp.push(arr[i]); temp.push(0); narr.push(temp); } return narr; } const m = new Map(fun(poll.options)); const pollPrompt = poll.registerNewAnswer.bind(poll); pollPrompt(m); document.querySelector('.poll').addEventListener('click',poll.registerNewAnswer.bind(poll));El problema es cuando la devolución de llamada se ejecuta al click , m apunta al HTMLDOMNode y no al map
Puedes hacer lo siguiente:
const poll = { question: 'What is your favourite programming language?', options: ['0: JavaScript', '1: Python', '2: Rust', '3: C++'], // This generates [0, 0, 0, 0]. More in the next section 😃 answers: new Array(4).fill(0), registerNewAnswer(m){ console.log('m', m); const answer = Number(prompt(`${this.question}\n${this.options.join('\n')}`)); answer < 4 && answer >= 0 ? answer : alert('invalid entry try again'); //console.log(answer); m.set(this.options[answer],m.get(poll.options[answer]) + 1) } } const fun = function(arr){ let narr =[]; for(let i =0;i<arr.length;i++){ let temp = []; temp.push(arr[i]); temp.push(0); narr.push(temp); } return narr; } const m = new Map(fun(poll.options)); const pollPrompt = poll.registerNewAnswer.bind(poll); pollPrompt(m); document.querySelector('.poll').addEventListener('click', () => { poll.registerNewAnswer(m) });