最近在在学习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 == null) return '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 } 明天继续。