Comenzando tengo algunos planos de objetos como este
const blueprints = [ { "name": "Wizard", "effect": () => doWizardStuff() }, { "name": "Paladin", "effect": () => doPaladinStuff() } ] Por ahora supongamos que las dos funciones doWizardStuff() y doPaladinStuff() simplemente hacen console.log(this)
Más tarde creo Objetos a partir de los planos usando Constructores así:
function Card(fromBlueprint, player){ this.name = fromBlueprint.name this.effect = fromBlueprint.effect this.belongsTo = player } let myWizard = new Card(blueprints[0],"Player1") let myPaladin = new Card(blueprints[1],"Player1") Ahora me enfrento a dos problemas. El primer problema es que si no envuelvo el "efecto" en planos en una función anónima, la función asignada se ejecuta durante la ejecución new Card(...) , que no necesito ni quiero. Sin embargo, interpreta "esto" correctamente, como el Objeto que llamó a la función.
{ ... "effect": doWizardStuff() ...}, { ... "effect": () => doPaladinStuff() ...} let myWizard = new Card(blueprints[0],"Player1") // Card {name: "wizard", effect: doWizardStuff()} let myPaladin = new Card(blueprints[1],"Player1") // doesn't log anything, as doPaladinStuff() doesnt get called during constructionEspero que la diferencia sea clara con el ejemplo, doWizardStuff() se llama durante la construcción, mientras que doPaladinStuff() no, ya que está envuelto en una función anónima. Más adelante en el código puedo llamarlo usando:
myPaladin.effect() //[object Window] Sin embargo, cuando llamo a la función de esta manera, "esto" registra [ventana de objeto] y no la Card {name: "Paladin", effect: () => doPaladinStuff()} que la llamó. Ahora mi investigación me ha llevado a creer que .bind o .call pueden resolver este problema, sin embargo, no he descubierto cómo o dónde implementarlos. Para reformular, mis dos preguntas son
Hasta ahora he probado muchas variaciones del código, pero no he podido hacer que ninguna funcione. Intenté usar "effect": function() {doPaladinStuff()} en lugar de funciones de flecha, pasando "this" como argumento, "effect":function() {doPaladinStuff()}.bind(this) y combinaciones de todos ellos .
Entonces, para resumir, mis dos preguntas son:
¿Hay alguna manera de evitar que se llame a una función durante la construcción, que no incluya envolver dicha función en una función anónima?
si no, ¿cómo puedo pasar "esto" a la función envuelta, de modo que se refiera al objeto que lo llamó y no al Objeto Ventana?
Estoy usando solo Javascript vainilla.