您的位置:首页 > Web前端 > JavaScript

JavaScript闭包中的静态方法和普通方法调用方式

2013-12-20 15:23 621 查看
最近调试代码在闭包上出现了一点小插曲,明明定义了方法却找不到,后来发现是由于方法定义的方式引起的,有的是类的静态方法,有的是类对象的普通方法,所以调用的方式会不一样。闲话少说,贴代码先。

// 定义辅助类
(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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: