`

prototype框架解读

    博客分类:
  • Ajax
 
阅读更多
原文出自:http://forum.iteye.com/viewtopic.php?t=14347
我喜欢Javascript,热衷于 Ajax 应用。我把自己阅读prototype源码的体会写下来,希望对大家重新认识 Javascript 有所帮助。

我相信prototype的开发者们一定也很欣赏Ruby,如果你能了解一些Ruby的话,阅读prototype的源码就能更心神领会。

抱歉不能以 code 的形式贴出来,因为会出现乱码?

一. prototypes.js

引用:

/**
* 定义一个全局对象, 属性 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 引用被改变为参数提供的对象。
* 比如:
* <input type="text" id="aaa" value="aaa">
* <input type="text" id="bbb" value="bbb">
* .................
* <script>
* var aaa = document.getElementById("aaa");
var bbb = document.getElementById("bbb");
aaa.showValue = function() {alert(this.value);}
aaa.showValue2 = aaa.showValue.bind(bbb);
* </script>
* 那么,调用aaa.showValue 将返回"aaa", 但调用aaa.showValue2 将返回"bbb"。
*
* apply 是ie5.5后才出现的新方法(Netscape好像很早就支持了)。
* 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp
* 还有一个 call 方法,应用起来和 apply 类似。可以一起研究下。
*/
Function.prototype.bind = function(object) {
var method = this;
return 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();
break;
} catch (e) {}
}

return returnValue;
}
}

/*--------------------------------------------------------------------------*/

/**
* 一个设计精巧的定时执行器
* 首先由 Class.create() 创建一个 PeriodicalExecuter 类型,
* 然后用对象直接量的语法形式设置原型。
*
* 需要特别说明的是 rgisterCallback 方法,它调用上面定义的函数原型方法bind, 并传递自己为参数。
* 之所以这样做,是因为 setTimeout 默认总以 window 对象为当前对象,也就是说,如果 registerCallback 方法定义如下的话:
* registerCallback: function() {
* setTimeout(this.onTimerEvent, this.frequency * 1000);
* }
* 那么,this.onTimeoutEvent 方法执行失败,因为它无法访问 this.currentlyExecuting 属性。
* 而使用了bind以后,该方法才能正确的找到this,也就是PeriodicalExecuter的当前实例。
*/
var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
initialize: function(callback, frequency) {
this.callback = callback;
this.frequency = frequency;
this.currentlyExecuting = false;

this.registerCallback();
},

registerCallback: function() {
setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000);
},

onTimerEvent: function() {
if (!this.currentlyExecuting) {
try {
this.currentlyExecuting = true;
this.callback();
} finally {
this.currentlyExecuting = false;
}
}

this.registerCallback();
}
}

/*--------------------------------------------------------------------------*/

/**
* 这个函数就 Ruby 了。我觉得它的作用主要有两个
* 1. 大概是 document.getElementById(id) 的最简化调用。
* 比如:$("aaa") 将返回上 aaa 对象
* 2. 得到对象数组
* 比如: $("aaa","bbb") 返回一个包括id为"aaa"和"bbb"两个input控件对象的数组。
*/
function $() {
var elements = new Array();

for (var i = 0; i < arguments.length; i++) {
var element = arguments[i];
if (typeof element == 'string')
element = document.getElementById(element);

if (arguments.length == 1)
return element;

elements.push(element);
}

return elements;




Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=632446

分享到:
评论

相关推荐

    使用Prototype框架.pdfprototype源码分析.doc

    例解Prototype框架.doc 第21章__使用Prototype框架.pdf Prototype源码注释版.pdf proprototype源码分析.doc totype_1.3_源码解读.txt

    prototype-1.4.0源码解读.js

    《Prototype 1.4.0 源码解读:深入理解JavaScript库的基石》 Prototype 是一个著名的JavaScript库,它的1.4.0版本在Web开发领域有着广泛的使用。这个库为JavaScript程序员提供了许多实用的功能,包括对象扩展、类...

    【Prototype 1.4.0】源码解读----全文注释版

    Prototype框架的核心组件包括: 1. **全局对象Prototype**:框架定义了一个全局变量`Prototype`,其中包含版本信息(`Version`)、正则表达式(`ScriptFragment`)、空函数(`emptyFunction`)以及一个返回参数本身...

    prototype1.6.0源码解读.js

    ### Prototype 1.6.0源码解读 #### 前言 Prototype 是一个轻量级的 JavaScript 库,它简化了 DOM 操作,并提供了一系列便捷的方法来处理对象、数组等基本类型。本文将深入剖析 Prototype 1.6.0 的核心特性与实现...

    [转]prototype 源码解读 超强推荐第1/3页

    《Prototype 源码解读:探索 JavaScript 框架的核心》 Prototype 是一款著名的 JavaScript 框架,它旨在简化动态网页应用的开发工作。框架以其独特的类驱动开发工具和友好的 Ajax 库而受到 Web 2.0 开发者的青睐。...

    prototype-1.6.0.2.js.rar

    在"prototype-1.6.0.2.js.rar"这个压缩包中,包含了Prototype库的1.6.0.2版本源码和相关的API文档,是深入学习和应用Prototype框架的重要资源。 一、Prototype库基础 Prototype库的核心理念是通过面向对象的编程...

    最新Prototype手册

    《最新Prototype手册》详细解读 Prototype.js 是一个广泛使用的JavaScript库,它为浏览器环境提供了许多实用的功能,大大简化了JavaScript的开发。这份“最新Prototype手册”深入探讨了这个库的核心特性,旨在帮助...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、数据库高级应用、JFreeChart绘图基础、基础图表技术、扩展图表技术、基于Cewolf组件的图表编程、Prototype框架、jQuery...

    Java Web开发实例大全

    重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、数据库高级应用、JFreeChart绘图基础、基础图表技术、扩展图表技术、基于Cewolf组件的图表编程、Prototype框架、jQuery...

    图解Spring框架的设计理念与设计模式

    1. 单例模式:Spring默认会为每个Bean创建一个单例实例,除非配置为原型(Prototype)。 2. 工厂方法模式:通过BeanFactory的getBean()方法获取Bean实例。 3. 模板方法模式:如JdbcTemplate、HibernateTemplate等,...

    spring源码解读.txt

    ### Spring框架核心概念与源码解析 #### 一、Spring框架简介 Spring是一个开源的Java应用框架,由Rod Johnson创建并领导开发。Spring的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect ...

    第四课:IOC容器设计理念与源码解读 (2)1

    【第四课:IOC容器设计理念与源码解读 (2)1】 本课程主要涵盖了IOC(Inversion of Control,控制反转)的核心理论以及实体Bean的创建方式,深入解析了Spring框架中的IOC设计原理。以下是对这些知识点的详细阐述: ...

    vue源码解读.zip

    Vue.js 是一款非常流行的前端JavaScript框架,以其轻量级、高效和易用性著称。Vue的核心设计理念是数据驱动和组件化,它使得构建用户界面变得更加简单和直观。本压缩包"vue源码解读.zip"提供了对Vue源码的深入解析,...

    JAVA 设计模式的详细讲解另类解读

    在另类解读部分,作者可能会以不同寻常的角度或实例来阐述这些模式,帮助开发者跳出传统的思维框架,更深入理解设计模式的本质和应用场景。例如,可能会通过游戏开发或者并发处理的例子来解析某些模式,使得理论知识...

    ssm框架源码分析之.docx

    6.源码解读在 spring 源码中,`BeanDefinition` 类代表 Bean 的定义,包含了 Bean 的所有元数据。`DefaultListableBeanFactory` 使用 `BeanDefinitionRegistry` 来存储 Bean 的定义,并通过 `InstantiationStrategy`...

    Increasing Interpretation of Web Topic Detection via Prototype Learning From Sparse Poisson Deconvolution

    #### 摘要解读与核心问题阐述 本文旨在解决网络主题检测中的一个关键挑战:如何提高所检测到的主题的可解释性和准确性。网络数据通常具有稀疏性、噪声以及用户自动生成内容的不约束性等特点,这些特性导致特征表示...

    Voice-Control-prototype:Piyu-UI和Dr.Piyu原型版本的组合

    【标签解读】 "JavaScript"标签表明这个项目使用JavaScript作为主要编程语言。JavaScript在前端开发中广泛用于构建动态、交互式的用户界面,而且也有许多库和框架(如React, Angular, Vue等)支持语音识别功能,因此...

    前端面试指南

    这个图谱包含了近百个高频知识点,不仅覆盖了前端的基础知识,还有进阶内容和源码解读。面试者可以通过这个图谱来查漏补缺,加深对前端知识的理解,从而在面试中展示自己的能力。这个图谱会持续更新,包括更多内容,...

Global site tag (gtag.js) - Google Analytics