Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

189
Views
Cómo pasar "esto" a la función anónima llamada desde un objeto en Javascript

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 construction

Espero 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:

  1. ¿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?

  2. 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.

about 4 years ago · Santiago Gelvez
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!