JavaScript闭包中的静态方法和普通方法调用方式
2013-12-20 15:23
621 查看
最近调试代码在闭包上出现了一点小插曲,明明定义了方法却找不到,后来发现是由于方法定义的方式引起的,有的是类的静态方法,有的是类对象的普通方法,所以调用的方式会不一样。闲话少说,贴代码先。
这段代码是没有问题的,关键是主类中的say方法是基于对象建立的,所以我们在new完对象调用就OK!假如我们直接Person.say(),结果是找不到say方法。如果我们想把say方法设置为静态的,可以修改代码如下:
在这里我们发现一个有趣的问题,就是主类中对于Think方法的调用方式都是this.$.Think(),同样的this却表示不同的意思,一个是Person类,一个是Person对象。
// 定义辅助类 (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对象。
相关文章推荐
- 为什么java静态方法不能调用普通方法?普通方法能调用静态方法?
- php 静态方式调用非静态的方法
- 面向对象银角大王补充2-self就是调用当前方法的对象-静态字段,公有属性-封装的理解-继承的理解,普通方法,静态方法
- PHP中的静态方法和非静态方法调用方式再解
- Java static静态属性和静态方法内存分析和注意事项静态方法不能调用非静态属性和非静态方法,普通方法可以调用静态属性和方法
- 有关静态方法和普通方法的调用
- 有关静态方法和普通方法的调用
- 非静态方法和静态方法相互调用的方式
- 学习笔记--静态方法调用,多肽,操作符重载,3中参数传递方式,二维数组与交错数组
- C#-面向对象——如何调用使用类 普通方法、静态方法的使用
- servlet调用方式几种方法
- 11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方式。
- 静态普通方法名匹配切面
- java中静态方法中调用非静态方法
- 静态代码块、普通代码块、构造方法的执行顺序
- 多种方式实现JS调用后台方法进行数据交互
- Unity3D调用android方法(非插件方式)
- 多线程陷阱(不要调用run方法;静态的同步方法)
- C# asp.net 在ajax调用的后台静态方法中获取Session
- activity以绑定服务的方式开启服务并调用服务里面的方法