最近调试代码在闭包上出现了一点小插曲,明明定义了方法却找不到,后来发现是由于方法定义的方式引起的,有的是类的静态方法,有的是类对象的普通方法,所以调用的方式会不一样。闲话少说,贴代码先。
// 定义辅助类
(function(wnd){
wnd.skill = {};
var $think = skill.Think = function(){
return 'I can think!';
};
})(window);
// 定义主类
(function(wnd){(function(_){
this.prototype['$'] = _;// 传递辅助类
this.prototype['say'] = function(){
console.log('Person Say:' + this.$.Think());
};
}).call(wnd.Person = function(){}, skill)})(window);
// Test GOOD
var p = new Person(); // Person Say:I can think!
p.say();
这段代码是没有问题的,关键是主类中的say方法是基于对象建立的,所以我们在new完对象调用就OK!假如我们直接Person.say(),结果是找不到say方法。如果我们想把say方法设置为静态的,可以修改代码如下:
// 定义辅助类
(function(wnd){
wnd.skill = {};
var $think = skill.Think = function(){
return 'I can think!';
};
})(window);
// 定义主类
(function(wnd){(function(_){
this['$'] = _;//传递辅助类
this['say'] = function(){
console.log('Person Say:' + this.$.Think());
};
}).call(wnd.Person = function(){}, skill)})(window);
//Test GOOD
Person.say();//Person Say:I can think!
在这里我们发现一个有趣的问题,就是主类中对于Think方法的调用方式都是this.$.Think(),同样的this却表示不同的意思,一个是Person类,一个是Person对象。