2014-11-25 147 views
0

創建self = this變量會很舒服。在所有方法中,我們總是可以使用self,並且不用擔心方法上下文 - 有時候這個的方法不是我們所期望的。 但是在原型方法中我們不能使用這個提示;在原型方法中使用此方法的最佳方法

看(jQuery的需要onle顯示的問題)

var myClass = function() { 
    this.propery = 'someData'; 

    var self = this; 

    this.method = function() { 
     console.log(self.propery); 
    } 
} 

myClass.prototype.method2 = function() { 
    // want to use self here 
    console.log(this); 
} 


var my = new myClass(); 

var eventBus = $({}); 
eventBus.bind('onMyEvent', my.method); 
eventBus.bind('onMyEvent', my.method2); 

eventBus.trigger('onMyEvent'); 

什麼是可能性聲明類使用原型方法的最佳方式的例子嗎?

+0

沒有,你就不能使用'在原型方法self'。如果你需要'self',不要讓它們成爲原型方法。或者甚至更好,當你將它用作事件處理程序時,將方法綁定到實例。 – Bergi 2014-11-25 08:48:18

+0

您所顯示的代碼中不需要「自我」。註冊事件處理程序時使用「綁定」。 如果你以後需要'self = this',請嘗試'var self = this' 因此它不會污染全球空間。 – Pranav 2014-11-25 08:49:32

+0

@Bergi謝謝。不知道如何標記你的評論作爲回答 – user1167761 2014-11-28 12:20:24

回答

2

你不需要self,只需要通過binding對象的函數來設置的this值:

var MyClass = function() { 
    this.property = 'someData'; 
    this.method = function() { 
    console.log(this.property); 
    }; 
}; 

MyClass.prototype.method2 = function() { 
    console.log(this); 
}; 

var my = new MyClass(); 

var eventBus = $({}); 
eventBus.bind('onMyEvent', my.method.bind(my)); // bind 
eventBus.bind('onMyEvent', my.method2.bind(my)); // bind 

eventBus.trigger('onMyEvent'); 
+0

'.bind'是一個ES5的東西,所以它不適用於早期的瀏覽器。對於早些時候,你可以在包裝器中使用'.apply()',或者如果jquery(該例子看起來像使用jquery),則使用'$ .proxy(fn,this)'。我可以編輯答案,如果你想 – deitch 2014-11-25 08:50:15

+0

我不會花太多時間來支持古代瀏覽器,我會包括[es5-shim](https://github.com/es-shims/es5-shim),使用代碼並在一天內調用它。 – elclanrs 2014-11-25 08:52:09

+0

根本不需要使用任何墊片,因爲jQuery已經帶有'bind'實現。 – dfsq 2014-11-25 08:52:56