谁动了我的代码

抽象即是空,空即是抽象。
posts(43) comments(24) trackbacks(0)
  • BlogJava
  • 联系
  • RSS 2.0 Feed 聚合
  • 管理

News

所有文章版权归我所有,转载请注明出处,谢谢!

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔分类

  • Android开发(5)
  • C/C++(1)
  • DataBase(3)
  • Java(16)
  • JavaScript(14)
  • WEB前端(1)
  • 编程杂项(2)
  • 网络(1)

随笔档案

  • 2016年5月 (1)
  • 2011年2月 (1)
  • 2010年6月 (3)
  • 2010年5月 (1)
  • 2009年12月 (2)
  • 2009年11月 (1)
  • 2009年10月 (2)
  • 2009年6月 (2)
  • 2009年5月 (1)
  • 2009年4月 (2)
  • 2009年3月 (4)
  • 2009年2月 (1)
  • 2009年1月 (1)
  • 2008年12月 (1)
  • 2008年11月 (1)
  • 2008年10月 (4)
  • 2008年9月 (2)
  • 2008年5月 (5)
  • 2008年3月 (3)
  • 2007年12月 (2)
  • 2007年10月 (1)
  • 2007年9月 (2)
  • 2007年5月 (1)

搜索

  •  

最新评论

  • 1. re: Android之ImageView载入网络上的图片
  • 222222222222222222222
  • --2222222222222222222222222222
  • 2. re: Log4j自带Log Viewer的用法
  • 执行你的根本不行,乱错帖子就在这乱贴,tmd
  • --asdf
  • 3. re: Android之使用私有存储
  • getDir方法创建的文件,会有个app_前缀,请问这怎么去掉呢?
  • --就是宝宝
  • 4. re: Android通用事件造成的生命周期变化情况
  • 我相信以后Android将成为越来越多设备的OS,不光是手持上网设置,冰箱、洗衣机都有可能采用Android。
  • --淘宝网女装春装新款
  • 5. re: Android通用事件造成的生命周期变化情况
  • 不错
  • --歌瑞尔内衣

阅读排行榜

评论排行榜

View Post

参考Prototype的Class.create写了一个类似的实现,但是不是Ruby like OOP,使用上更像Java。

实现代码:
 1 function $A (Arguments) {
 2     var result = [];
 3     for (var i = 0; i < Arguments.length; i++)
 4         result.push(Arguments[i]);
 5     return result;
 6 }
 7 
 8 Class = {
 9     create : function () {
10         var args = $A(arguments);
11         var parentClass = args.shift();
12         var properties;
13         if (parentClass instanceof Function)
14             properties = args.shift();
15         else if (parentClass instanceof Object) {
16             properties = parentClass;
17             parentClass = void 0;
18         }
19         
20         var klazz = function () {
21             if (this.initialize) this.initialize.apply(this, arguments);
22         };
23         
24         if (parentClass) {
25             var tmpClass = new Function;
26             tmpClass.prototype = parentClass.prototype;
27             klazz.prototype = new tmpClass();
28             klazz.prototype.constructor = klazz;
29         }
30         
31         for (var key in properties) {
32             if (properties[key] instanceof Function && klazz.prototype[key] instanceof Function) {
33                 klazz.prototype[key] = (function () {
34                     var _parent = klazz.prototype[key];
35                     var _method = properties[key];
36                     return function() {
37                         var _this = this;
38                         $super = function(){
39                             _parent.apply(_this, arguments);
40                         }
41                         _method.apply(this, arguments);
42                     }
43 
                })();
44             }
45             else 
46                 klazz.prototype[key] = properties[key];
47         }
48         
49         return klazz;
50     }
51 }

测试代码:
 1
 2             T = Class.create({
 3                 initialize : function (tt,mm) {
 4                     alert("initialize T");
 5                     this.tt = tt;
 6                     this.mm = mm;
 7                 },
 8                 l : function () {
 9                     alert("f");
10                 },
11                 f : function () {
12                     alert(123);
13                 }
14             });
15             
16             M = Class.create(T, {
17                 initialize : function (tt,mm,nn) {
18                     $super(tt,mm);
19                     alert("initialize M");
20                     this.nn = nn;
21                 },
22                 f : function () {
23                     //$super();  这里也可以不调用父类的f方法
24                     alert(456);
25                 },
26                 s : function () {
27                     alert("sssss");
28                 }
29             });
30             
31             N = Class.create(M);
32             
33             m = new N(1,2,3);
34             m.f();
35             m.l();
36             m.s();
37             alert(m.tt);
38             alert(m.mm);
39             alert(m.nn);
40             alert(m instanceof N);
41             alert(m instanceof M);
42             alert(m instanceof T);

在做的过程中,上面粗体部分不是像现在这样实现的,遇到了一个怪异的问题,下面给出原来的实现:
1 var _parent = klazz.prototype[key];
2 var _method = properties[key];
3 klazz.prototype[key] = function() {
4     var _this = this;
5     $super = function(){
6          _parent.apply(_this, arguments);
7     }
8     _method.apply(this, arguments);
9 }
这种实现造成了klazz的prototype中的每个方法执行总是返回相同结果,原因是_parent和_method在create一个Class的 时候已经被固定到properties的最后一个key上,所以在运行的时候会返回相同的结果,解决方法如同上面粗体部分,必须用一个函数封装并立即执行 返回内部函数,这是闭包的一种使用方式,这种做法类似把函数内的内容做一个快照,返回的内部函数存取变量的时候其实是从快照中取得,而不是从 properties中取得。

这个版本并不能用在生产环境中,由于时间仓促,肯定会有BUG或不完善的地方。所以建议大家还是使用Prototype的实现,我这个实现只是用来更加深刻的理解一些概念,比如变量作用域链、闭包等等的使用。

posted on 2009-06-09 00:04 Eric Song 阅读(616) 评论(0)  编辑  收藏 所属分类: JavaScript

新用户注册  刷新评论列表  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
相关文章:
  • 关于样式表对象style与currentStyle的区别
  • 关于JavaScript的cloneNode方法对于节点上的事件clone问题的研究。
  • 参考Prototype的Class.create写了一个类似的实现,但是不是Ruby like OOP,使用上更像Java。
  • 对JavaScript的变量作用域的理解
  • IE document compatMode
  • JavaScript对form及form中的引用。
  • JavaScript注意事项(不定期更新)
  • 在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的实例对象
  • JavaScript 类型转换注意事项
  • 面向对象的JavaScript(二,TSS上的一篇文章,先借鉴一下)
 
 
Powered by:
BlogJava
Copyright © Eric Song