我喜欢 Javascript,热衷于 Ajax 应用.我把自己阅读 prototype 源码的体会写下来,希望对大家重新认识
Javascript 有所帮助. 代码: 代码
/** * 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 */ var Prototype = { Version: '@@VERSION@@' }
/** * 创建一种类型,注意其属性 create 是一个方法,返回一个构造函数. * 一般使用如下 * var X = Class.create(); 返回一个类型,类似于 java 的一个 Class 实例.
* 要使用 X 类型,需继续用 new X()来获取一个实例,如同 java 的 Class.newInstance()方法. * * 返回的构造函数会执行名为 initialize 的方法, initialize 是 Ruby 对象的构造器方法名字. * 此时 initialize 方法还没有定义,其后的代码中创建新类型时会建立相应的同名方法. * * 如果一定要从 java 上去理解. 你可以理解为用 Class.create()创建一个继承 java.lang.Class 类的类. 当然 java 不允许这样做,因为 Class 类是 final 的 * */ var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } } }
/** * 创建一个对象,从变量名来思考,本意也许是定义一个抽象类,以后创建新对象都 extend 它. * 但从其后代码的应用来看, Abstract 更多是为了保持命名空间清晰的考虑. * 也就是说,我们可以给 Abstract 这个对象实例添加新的对象定义. * * 从 java 去理解,就是动态给一个对象创建内部类. */ var Abstract = new Object();
/** * 获取参数对象的所有属性和方法,有点象多重继承.但是这种继承是动态获得的.
* 如: * * var a = new ObjectA(), b = new ObjectB(); var c = a.extend(b);
* 此时 c 对象同时拥有 a 和 b 对象的属性和方法.但是与多重继承不同的是,c instanceof ObjectB 将返回 false. */ Object.prototype.extend = function(object) { for (property in object) { this[property] = object[property]; } return this; }
/** * 这个方法很有趣,它封装一个 javascript 函数对象,返回一个新函数对象,新函数对象的主体和原 对象相同,但是 bind()方法参数将被用作当前对象的对象. * 也就是说新函数中的 this 引用被改变为参数提供的对象. * 比如: * * * * * * * * *
.................
* 那么,调用 aaa.showValue 将返回"aaa", 但调用 aaa.showValue2 将返回"bbb". * * apply 是 ie5.5 后才出现的新方法(Netscape 好像很早就支持了). * 该方法更多的资料参考 MSDN msdn.microsoft/library/en-us/script56/html/js56jsmthApply.asp * 还有一个 call 方法,应用起来和 apply 类似.可以一起研究下. */ Function.prototype.bind = function(object) { var method = this; re
turn function() { method.apply(object, arguments); } }
/** * 和 bind 一样,不过这个方法一般用做 html 控件对象的事件处理.所以要传递 event 对象 * 注意这时候,用到了 Function.call.它与 Function.apply 的不同好像仅仅是对参数形式的定义.
* 如同 java 两个过载的方法. */ Function.prototype.bindAsEventListener = function(object) { var method = this; return function(event) { method.call(object, event || window.event); } }
/** * 将整数形式 RGB 颜色值转换为 HEX 形式 */ Number.prototype.toColorPart = function() { var digits = this.toString(16); if (this < 16) return '0' + digits; return digits; }
/** * 典型 Ruby 风格的函数,将参数中的方法逐个调用,返回第一个成功执行的方法的返回值 */ var Try = { these: function() { var returnValue;
for (var i = 0; i < arguments.length; i++) { var lambda = arguments[i]; try { returnValue = lambda(