Esta es una de esas pruebas de entrevista de trabajo en HackerRank que me avergüenza decir que no completé en los 20 minutos asignados, y me está volviendo loco. Básicamente, se le da lo siguiente:
function myList() { // write code here } function main() { // You can't edit this function. This is just pseudo, from what I can remember const obj = myList(); if (operation === "add") obj.add(item); else if (operation === "remove") obj.remove(item); else obj.getList(); // Some more stuff here } Así que mi primera línea de pensamiento fue escribir lo siguiente dentro de myList() :
let objList = []; function add(item) { objList.add(item) } // etc., etc. return {add, remove, getList}; No hace falta decir que lo anterior no funcionó, con el error: obj.add is not a function , en la función main .
Intenté experimentar con this y las devoluciones (solo devolviendo add, con o sin {} ), pero realmente no llegué a ninguna parte. ¿Qué podría haber hecho para que esto funcionara?
Para obj , dentro de myList() podría haber ejecutado un cierre, que es una función de autoinvocación que devuelve, en este caso, un objeto con sus exportaciones k:v, pero con acceso privado al contexto de la persona que llama anónima ahora caducada. Con declaraciones "const add = function" , etc., puede definir valores para sus exportaciones, mientras que objList va en el contexto privado.
Como ya sugirió la respuesta de Attersson , podría usar un cierre dentro de la función myList . Esto permitiría exponer solo los tres métodos add , remove y getList mientras no se puede acceder a la lista original. Aquí hay un ejemplo:
function myList() { return (() => { const obj = {itemList: []} const add = (item) => obj.itemList.push(item) const remove = (item) => obj.itemList = obj.itemList.filter(i => i !== item) const getList = () => obj.itemList return {add, remove, getList} })() }