2012-04-04 13 views
5

¿Cómo puedo obtener variable en controlador función de obj? Sin referencia del obj en MyClass.¿Cómo llamar a la clave del objeto dentro de la devolución de llamada?

var obj = { 
     func: function(){ 
      var myClass = new MyClass(); 
      myClass.handler = this.handler; 
      myClass.play();   
     }, 

     handler: function(){ 
      //Here i don't have access to obj 
      console.log(this); //MyClass 
      console.log(this.variable); //undefined 
     }, 

     variable:true 
    }; 

    function MyClass(){ 
     this.play = function(){ 
      this.handler(); 
     }; 

     this.handler = function(){}; 
    }; 

    obj.func(); 

Eso es lo que necesita la construcción, si se utiliza Base.js o de otra forma similar de programación orientada a objetos.

_.bindAll (obj) (guion bajo) no es adecuado. Se está rompiendo anulando en Base.js.

Respuesta

2

sólo obligará método de control: http://jsfiddle.net/uZN3e/1/

var obj = { 
    variable:true, 

    func: function(){ 
     var myClass = new MyClass(); 
     // notice Function.bind call here 
     // you can use _.bind instead to make it compatible with legacy browsers 
     myClass.handler = this.handler.bind(this); 
     myClass.play();   
    }, 

    handler: function(){ 
     console.log(this.variable); 
    } 
}; 

function MyClass(){ 
    this.play = function(){ 
     this.handler(); 
    }; 

    this.handler = function(){}; 
}; 

obj.func(); 
​ 
0

Declarar variable antes handler:

var obj = { 
    variable: true, 

    func: function(){ 
     // ...  
    }, 

    handler: function(){ 
     console.log(this.variable); //true 
    } 
}; 
+2

No, no es trabajo. [Prueba] (http://jsfiddle.net/uZN3e/) – Boyo

2

utilizar una variable para hacer referencia contexto original:

... 
var self = this; 
myClass.handler = function(){ self.handler(); }; 
... 
+0

Hmmm, no lo creo. Sugiere definir _handler_ dentro de la función _func_. Pero si _func_ tendrá muchos oyentes, y estos oyentes serán masivos, obtendrá una función muy grande. Creo que es un mal tono de programación. – Boyo

+1

De hecho, 'Function.bind' utiliza el mismo tipo de cosas y también es malo para el rendimiento. Necesita estructurar su código de una manera que no necesite enlaces como este. https://gist.github.com/2301514: crea un cierre (una función) para cada una de las funciones enlazadas y coloca un objeto de contexto dentro de ese cierre. Por lo tanto, esta respuesta también es válida y, para el desarrollador, es más obvia, en realidad podría ser mejor (según sus necesidades) –

+0

Tiene razón, sobre el rendimiento. ¿Pero qué hacer con "Pero si Func tendrá muchos oyentes, y estos oyentes serán masivos, obtendrás una función muy grande"? ¿Crees que las funciones grandes están bien? – Boyo

0

Uso llamada a función con esto desde Obj en declarado en un alcance var a resuélvelo.

var obj = { 
    func: function(){ 
     var self = this; 
     var myClass = new MyClass(); 
     myClass.handler = function() { return this.handler.call(self); }; 
     myClass.play();   
    }, 

    handler: function(){ 
     //Here i don't have access to obj 
     console.log(this); //MyClass 
     console.log(this.variable); //undefined 
    }, 

    variable:true 
}; 
0

Usted no tiene acceso a obj porque este se unen a la instancia de MyClass constructor - myClass. Si en manejador que desea tener acceso a myClass través este y el acceso a obj usted tiene que utilizar obj nombre directamente de modo:

console.log(this); // myClass 
console.log(obj.variable); // true 

Si usted quiere tener este enlazar a obj usar lo que Juan Mellado o Gryzzly sugirieron.

Cuestiones relacionadas