2012-04-04 37 views
5

Làm cách nào tôi có thể nhận được biến trong xử lý chức năng của obj? Không có tham chiếu của obj trong MyClass.Làm thế nào để gọi khóa của đối tượng bên trong của cuộc gọi lại?

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(); 

Đó là công trình cần bạn, nếu bạn sử dụng Base.js hoặc cách tương tự khác của oop.

_.bindAll (obj) (metodcore metod) cũng không phù hợp. Đó là ghi đè phá vỡ trong Base.js.

Trả lời

2

Bind chỉ phương pháp xử lý: 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

Khai variable trước handler:

var obj = { 
    variable: true, 

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

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

Không, nó không hoạt động. [Bằng chứng] (http://jsfiddle.net/uZN3e/) – Boyo

2

Sử dụng một biến để tham khảo bối cảnh gốc:

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

Hmmm, tôi không nghĩ vậy. Bạn đề nghị xác định _handler_ bên trong hàm _func_. Nhưng nếu _func_ sẽ có nhiều người nghe, và những người nghe này sẽ rất lớn, bạn sẽ nhận được rất nhiều chức năng. Tôi nghĩ rằng đó là giai điệu xấu của lập trình. – Boyo

+1

Trên thực tế, 'Function.bind' đang sử dụng loại tương tự và cũng kém hiệu quả. Bạn cần phải cấu trúc mã của bạn theo cách mà sẽ không cần các ràng buộc như thế này. https://gist.github.com/2301514 - bạn tạo một đóng (một hàm) cho mỗi hàm bị ràng buộc và bạn đặt đối tượng bối cảnh trong đó đóng. Vì vậy, câu trả lời này cũng hợp lệ và rõ ràng hơn với nhà phát triển, có thể thực sự tốt hơn (tùy theo nhu cầu của bạn) –

+0

Bạn nói đúng, về hiệu suất. Nhưng phải làm gì với "Nhưng nếu func sẽ có nhiều người nghe, và những người nghe này sẽ lớn, bạn sẽ có được chức năng rất lớn"? Bạn nghĩ rằng các chức năng lớn là ok? – Boyo

0

Sử dụng cuộc gọi chức năng với điều này từ obj trong khai báo trong một phạm vi var để giải quyết nó.

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

Bạn không có quyền truy cập vào obj này được liên kết với trường hợp của MyClass constructor - myClass. Nếu trong handler bạn muốn có quyền truy cập vào myClass qua và quyền truy cập vào obj bạn phải sử dụng obj tên trực tiếp như vậy:

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

Nếu bạn muốn có này liên kết với obj sử dụng những gì Juan Mellado hoặc gryzzly đề xuất.

Các vấn đề liên quan