protoype.js学习(一)

      最近在在学习ajax,自然也就接触了prototype.js。看了源代码,感觉代码的写的不错,不过还是比较容易看懂。结合网上的一些资料以及自己的理解,写了一些注释 。
   
      
  1 /**
  2  * 定义一个全局对象
  3  */
  4 var Prototype = {
  5   Version: '1.4.0',
  6   ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
  7 
  8   emptyFunction: function() {},
  9   K: function(x) {return x}
 10 }
 11 
 12 /**
 13  * 定义一个类的创建模型,其方法create返回一个类,同时回执行一个intialize的初始化方法,即类的构造函数.
 14  * 声明一个类:var class1=Class.create();
 15  * intialize函数是类的构造函数,当new这个类时便会执行.达到了面向对象中的构造函数的效果.
 16  * intialize方法并没有定义,相应于一个虚函数,这个虚方法通常实现并不是在派生类中实现的
 17  * 而是创建一个完整类后,在其原形对象prototype中定义的
 18  * 如:
 19  *        var X=Class.create();
 20  *        X.prototype={
 21  *            initialize: function(userName){
 22  *                this.name=userName;
 23  *            },
 24  *            show:function(){
 25  *                alert(this.name);
 26  *            }
 27  *        }
 28  *        var x=new X('windfree');
 29  *        x.show();        
 30  * 这样每次创建实例时,initalize方法都会得到执行.从而实现类的构造函数(initalize)和类成员函数(show)一起定义的功能.
 31  * 为了能给构造函数传递参数,使用了这样的语句initialize.apply(this, arguments).实际上arguments是由function()中
 32  * 的参数传递进来的得,这里巧妙的使用了函数的apply方法,使参数中this指向new的实例对象,而不全局对象Class本身.便调用了实例对象
 33  * 的initalize方法.
 34  * 
 35  *  Class对象实现类似于:
 36  *         function Class(){
 37  *             create:function(){
 38  *                 this.initialize.apply(this, arguments);
 39  *             }
 40  *        }
 41  * 
 42  * 
 43  * 综述:
 44  *         实际上可以把Class.create()返回的类看作所有类的共同基类,它在构造函数中调用了一个虚
 45  *        方法initialize,所有继承于它的类都必须实现这个方法,完成构造函数的功能。
 46  
 47  * 
 48  */
 49 var Class = {
 50   create: function() {
 51     return function() {
 52       this.initialize.apply(this, arguments);
 53     }
 54   }
 55 }
 56 
 57 var Abstract = new Object();
 58 
 59 /**
 60  * extend是Object的静态方法,用于将参数sourece中所有的属性赋值到distination对象中.
 61  * 这里的for (property in source)可以看作是一种反射机制.
 62  * 通过反射来实现类似面向对象中的继承的功能
 63  *  例如:
 64  *         function class1(){            
 65  *        }
 66  *        class1.prototype={
 67  *            method:function(){ 
 68  *                 alert("method"); 
 69  *            }, 
 70  *            method2:function(){ 
 71  *                 alert("method2"); 
 72  *        } 
 73  *        }
 74  *        function class2(){
 75  *            
 76  *        }
 77  *        //让class2继承于class1并定义新成员 
 78  *        class2.prototype=(new class1()).extend({ 
 79  *              method:function(){ 
 80  *               alert("class2"); 
 81  *             } 
 82  *        });
 83  * 
 84  * 
 85  */
 86 Object.extend = function(destination, source) {
 87   for (property in source) {
 88     destination[property] = source[property];
 89   }
 90   return destination;
 91 }
 92 /**
 93  * 返回关于目标对象的文字描述,如果对象实例没有定义一个inspect函数,默认返回toString函数的值。
 94  */
 95 Object.inspect = function(object) {
 96   try {
 97     if (object == undefined) return 'undefined';
 98     if (object == nullreturn 'null';
 99     return object.inspect ? object.inspect() : object.toString();
100   } catch (e) {
101     if (e instanceof RangeError) return '';
102     throw e;
103   }
104 }
105 
106 /**
107  * 返回function的实例,这个实例和源function的结构一样,
108  * 但是它已被绑定给了参数中提供的object,就是说,function中的this指针指向参数object。
109  * 其目的将函数(object)作为一个对象的方法运行
110  * __method表示变量是静态成员,$A()返回一个数组.数组的shift()方法用于返回数组的第一个元素,并把它从数组中删除.
111  */
112 
113 Function.prototype.bind = function() {
114   var __method = this, args = $A(arguments), object = args.shift();
115   return function() {
116     return __method.apply(object, args.concat($A(arguments)));
117   }
118 }
119 /**
120  * bind类似,不同在于其目的将函数(object)作为事件监听器 
121  */
122 Function.prototype.bindAsEventListener = function(object) {
123   var __method = this;
124   return function(event) {
125     return __method.call(object, event || window.event);
126   }
127 }

      明天继续。

posted on 2006-12-05 13:10 windfree 阅读(555) 评论(0)  编辑  收藏 所属分类: javascript

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


网站导航: