刚接触python的时候,最不习惯的事情,就是每个方法都要加一个self。无论Javascript还是C#,都直接一个this搞定,干嘛非要加一个变量self。

前两天在写一个chrome的extensions,因为 content里和background交互必需要一个异步方法实现,如:

var Test = new Class({ 
    options: {}, 
    initialize: 
function(args) { 
        chrome.extension.sendRequest({ 
'type':'options' }, function(options) { 
            
this.options = options;
            …… 
        });
    } 
}); 

 

这个this应该是Test这个对象,但是回调方法里是空的。难道要把this做参数传过去,再call回来?还好,mootools里有个好方法,bind。

var Test = new Class({ 
    options: {}, 
    initialize: 
function(args) { 
        chrome.extension.sendRequest({ 
'type':'options' }, function(options) { 
            
this.options = options;
            …… 
        }.bind(
this));
    } 
}); 

 

这下OK了,继续写: 

var Test = new Class({ 
    options: {}, 
    initialize: 
function(args) { 
        chrome.extension.sendRequest({ 
'type':'options' }, function(options) { 
            
this.options = options;
            $each(
this.options, function(o, i) {
                
if (o == '1') {
                    
this.fun1();
                } 
else {
                    
this.fun2();
                }
            }.bind(
this));
        }.bind(
this));
    },
    fun1: 
function {},
    fun2: 
function {}
});  

 

就算有bind也不容易分清哪个this是什么了。而真实的代码比这个要恐怖的多,有的情况下,我们的确需要this指向其它的变量,而不是这个类。

最常用的解决方法,是这样:

var Test = new Class({ 
    options: {}, 
    initialize: 
function(args) {
        
var _self = this;
        chrome.extension.sendRequest({ 
'type':'options' }, function(options) { 
            _self.options 
= options;
            $each(_self.options, 
function(o, i) {
                
if (o == '1') {
                    _self.fun1();
                } 
else {
                    _self.fun2();
                }
            });
        });
    },
    fun1: 
function {},
    fun2: 
function {}
});  

我特别定义了一个_self的变量来代替this,这看起来象什么?python!

现在终于体会到python的self绝对不是多此一举。

 


 

 

posted on 2010-07-29 18:02  lobos  阅读(563)  评论(0编辑  收藏  举报