_.bindAll () op singleton-methoden voor JavaScript?

De methode obj2.method1, in de onderstaande code, wordt aangeroepen vanuit een ander object. Hoe bind ik de "deze context" zodat ik kan verwijzen naar obj1 van obj2?

var singleton = {
  obj1 : {
     a : 5
  },

  obj2 : {
    method1 : function(){
       this.obj1.a; //undefined
    }
  }
}

Ik heb geprobeerd underscore _.bindAll() te gebruiken - iets in deze zin - maar mislukt ...

var singleton = {
  obj1 : {
     a : 5
  },

  obj2 : {
    method1 : function(){
       this.obj1.a; //undefined
    }
  },
  init : function(){
       _.bind(this, obj2.method1)
  }
}

singleton.init();

Bedankt :)

1
@ ŠimeVidas: Hmm, maar ik denk dat het andere object de methode noemt met toepassen. Wat ik wil overbruggen ...
toegevoegd de auteur dani, de bron
singleton.obj1.a zou werken ...
toegevoegd de auteur Šime Vidas, de bron
Ik volg je niet helemaal ...
toegevoegd de auteur Šime Vidas, de bron

1 antwoord

  1. You need to reassign singleton.obj2.method2() with the results of _.bind():

    // in .init():

    this.obj2.method1 = _.bind(this.obj2.method1, this)

  2. To have singleton.init() have a proper this when called, you need to specify it explicitly:

    singleton.init.call(singleton)

Volledige demonstratie hier . Maar vergeet niet dat het patroon Singleton is < a href = "http://tech.puredanger.com/2007/07/03/pattern-hate-singleton/" rel = "nofollow"> bad , m'kay ?

1
toegevoegd
Dat is een geweldig antwoord. Bedankt :) Trouwens - in plaats van het singleton-patroon, wat zou je in dit geval aanbevelen, waar ik probeer een eenvoudig "helperhulpprogramma" te bedenken. Het hulpprogramma moet een aantal toepassingsinstellingen opslaan (waarvan sommige moeten worden geïnitialiseerd op init ()), waarnaar het kan verwijzen in zijn verschillende hulpmethoden. Ik dacht dat een singleton in orde zou zijn, omdat andere toepassingsobjecten deze helper dan kunnen vragen om enkele algemene berekeningen uit te voeren op basis van zowel gegeven argumenten als instellingen? Nogmaals bedankt.
toegevoegd de auteur dani, de bron