En Javascript, dado un objeto generador, ¿cómo hago para que genere el nombre de la función generadora que devolvió ese objeto generador?
En otras palabras:
function* thisIsMyName(i) { yield i; } const gen = thisIsMyName(10); console.log(gen.name); // How do I get this to output "thisIsMyName" using only the gen object? Llamar gen.name no funciona ya que no es una función sino un objeto generador
Me temo que no puede acceder así porque la referencia a la función que generó este generador está almacenada en una propiedad definida por un símbolo. Los símbolos son únicos y no se pueden recrear (pero no siempre, consulte Symbol.for ). Lo que significa que si no tiene la referencia a un símbolo, no puede obtener su valor.
Object.getOwnPropertySymbols() no devuelve los nativos.
Sin embargo, puede ver los accesorios de símbolo en la consola al inspeccionar la instancia:
Sin embargo, puede resolver esto con una función contenedora, es decir, una función que devolverá tanto el generador como la función del generador:
function thisIsMyName(value){ const generatorFunction = function* thisIsMyName(i) { yield i; } return { generator : generatorFunction(value), generatorFunction: generatorFunction } } const gen = thisIsMyName(10); console.log(gen.generatorFunction.name) // prints thisIsMyName console.log(gen.generator.next()) // prints {value: 10, done: false}De los comentarios:
Debería crear una fábrica intermedia que pasara una referencia a la función, así como el objeto generador devuelto.
No es realmente útil, pero puede ser algo como:
const someGenerator = { *thisIsMyName(i = 1, limit = 10) { while (i < limit) { yield i++; } }, get name() {return this.thisIsMyName.name}, }; const myGen = { name: someGenerator.name, i: someGenerator.thisIsMyName(15, 20)}; console.log(myGen.i.next().value, myGen.name);O ...
function createGenerator(name, min = 1, max = 10) { function* xGen() { while (min < max) { yield min++; } }; return {gen: xGen(), name,}; }; const myGen = createGenerator(`myName`, 15, 20); const values = []; let nxt = {}; while (!nxt.done) { nxt = myGen.gen.next(); !nxt.done && values.push(nxt.value); } console.log(values.join(`, `), `\nmyGen.name = '${myGen.name}'`);