`
geradle
  • 浏览: 13270 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

prototype 1.5 RC2 $ 函数的解读

阅读更多
最近闲的无聊,跟人打赌,看看能不能在一天时间内里面把prototype 1.5的 $函数读懂,赚顿饭吃吃,下面把理解贴出来,让大家看看算不算读懂了。
首先把想关代码贴一下。
function $(element) {
  if (arguments.length > 1) {
    for (var i = 0, elements = [], length = arguments.length; i < length; i++)
      elements.push($(arguments[i]));
    return elements;
  }
  if (typeof element == 'string')
    element = document.getElementById(element);
  return Element.extend(element);
}

if (!window.Element)
  var Element = new Object();

Element.extend = function(element) {
  if (!element) return;
  if (_nativeExtensions || element.nodeType == 3) return element;

  if (!element._extended && element.tagName && element != window) {

    var methods = Object.clone(Element.Methods), cache = Element.extend.cache;
    if (element.tagName == 'FORM')
      Object.extend(methods, Form.Methods);
    if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
      Object.extend(methods, Form.Element.Methods);

    Object.extend(methods, Element.Methods.Simulated);
    for (var property in methods) {
      var value = methods[property];
      if (typeof value == 'function' && !(property in element))
        element[property] = cache.findOrStore(value);
    }

  }

  element._extended = true;
  return element;
}

Element.extend.cache = {

  findOrStore: function(value) {

    return this[value] = this[value] || function() {
      return value.apply(null, [this].concat($A(arguments)));
    }
  }
}
Element.Methods = { ...}//代码太多,请参考prototype.js
下面为我的解读:
$函数可以接收多个参数,参数的类型可以为String或者用Element类扩展过的html element。当传入的为多个参数的时候,返回的为一个数组;单个参数为一个扩展过的element 或者null。

接下来解读Element.extend(element)成为理解$函数返回对象的关键。Element为一个singleton对象,对其extend方法的理解,我认为难点主要集中于
element[property] = cache.findOrStore(value);
的理解。这句话将cache.findOrStore返回的函数copy给elememt[property],使其成为element的一个方法。
然而这样做完全可以直接将
function() {
      return value.apply(null, [this].concat($A(arguments)));
    }
copy给element[property]。
为什么还需要通过函数cache.findOrStore这个函数的调用呢。那么这个cache体现在哪里呢,进一步问为什么函数名叫findOrStore呢?
那么让我们仔细看看cache.findOrStore这个函数体。
该函数返回的是一个function,在返回这个function的时候。他首先查看this[value]是否存在,存在则返回this[value],否则新生成一个函数,赋值给this[value]再返回。所以当你第二次调用这个函数的时候,他优先的查看是否this[value]具有值,我想这就是他取名于cache,并教findOrStore的意义吧。
接着让我再问一下,this[value]给那个对象动态添加了方法呢?根据JavaScript this关键字的含义,其应该存在于Element.extend.cache这个Object中。
BTW:value.apply(null, [this].concat($A(arguments)));中的this,为调用该方法的element。理解这一点是Extend.methods的方法理解的前提。
验证方法:你可以在findOrStore方法中增加一行alert(this[value]),当你第一遍使用$函数时他应该全部为undefined,当你第二遍使用的时候其将有值。更为简单的方法为直接alert(this['findOrStore']).
总结,Extend.cache充分体现了JS的特性。findOrStore方法设计的实在精妙。this指针真的比较难理解。
分享到:
评论
4 楼 jianfeng008cn 2007-02-06  
zkj_beyond 写道
jquery 出招,prototype.js 立马接招。

却害苦我们这帮二次开发的人。

相对来说 “绿色的”YUI 能让我舒服点点。


能否说得直白点,我没理解呢
3 楼 blood 2007-02-06  
fins     2006-12-14 23:14
我真希望 它的$可以支持 getElementsByName

可以变通一下,用 "$$()"
如下:$$('input[name="age"]')
2 楼 zkj_beyond 2006-12-15  
jquery 出招,prototype.js 立马接招。

却害苦我们这帮二次开发的人。

相对来说 “绿色的”YUI 能让我舒服点点。
1 楼 fins 2006-12-14  
我真希望 它的$可以支持 getElementsByName

相关推荐

    VRay Adv 1.5 RC2

    软件\VRay Adv 1.5 RC2 谁要谁拿,错过这个村就没得那个店了,呵呵

    UCenter_Home_1.5RC2_SC_GBK交友系统

    《UCenter_Home_1.5RC2_SC_GBK交友系统》是一款专为构建社交网络平台而设计的应用软件。该系统基于PHP编程语言和MySQL数据库,集成了社区、互动和用户中心的功能,旨在帮助网站搭建一个高效、稳定且易于管理的用户...

    Firefox火狐浏览器官方1.5rc2-mac版本dmg安装包

    《Firefox火狐浏览器1.5rc2-mac版本:历史、功能与安装指南》 Firefox,作为一款由Mozilla基金会开发的开源网络浏览器,以其强大的安全性能、高度的可定制性和丰富的扩展插件闻名于世。在众多版本中,Firefox 1.5...

    Firefox火狐浏览器官方1.5rc2-win32版本exe安装包

    本文将详细解读“Firefox火狐浏览器官方1.5rc2-win32版本exe安装包”,帮助用户了解这一历史版本的特性、安装过程以及相关注意事项。 首先,我们要明确的是,“Firefox 1.5rc2”是Firefox火狐浏览器1.5版本的第二个...

    prototype1.5中文说明

    此版本1.5RC2是Prototype的一个中期候选版本,提供了一些重要的改进和功能增强。 Prototype的核心在于其对DOM(文档对象模型)的处理,使得JavaScript与HTML元素的交互变得简单易行。以下是一些关键知识点: 1. **...

    Firefox官方1.5rc2-win32版本exe安装包

    资源全名:Firefox Setup 1.5rc2.exe

    Prototype最新版(1.5 rc2)使用指南(1)

    Prototype是JavaScript领域中的一款著名框架,其最新版1.5 rc2旨在简化动态Web应用程序的开发。这款框架提供了一个独特的工具包,支持类驱动的开发,并拥有出色的Ajax库,因此在Web开发者中广受欢迎。Prototype的...

    最新TunSafe-1.5-rc2和教程.rar

    最新TunSafe-1.5-rc2和教程,有图文介绍,如果有需要,还可以下载我的另外一个连接TunSafe-tap配套使用

    Prototype1.5 rc2版指南最后一篇之Position

    Position是prototype中定义的一个对象,提供了操作DOM中与位置相关的方法,要很好的理解元素在页面中的位置,可以参考这篇文章:Relatively Absolute 具体代码如下,按照代码说说,其中英文是作者的注释,中文红色的...

    UCHome 1.5 RC2 UTF8版

    RC2版是UCHome1.5正式发布前的最后一个版本,在这个版本中你可以在后台开启MYOP开放平台开发标准,集成很多好玩的应用。開啟用戶應用功能 後,用戶可以自由選擇各種不同的或好玩有趣、或實用的等應用(諸如電影、送...

    TunSafe-1.5-rc2.zip

    tunSafe1.5-rc2

    prototype 1.7 Rc2

    Ajax 框架 prototype 1.7 rc2 支持多种游览器

    maven-support-1.5-rc2.jar

    maven-support-1.5-rc2.jar

    vray渲染器下载 VRAY 1 5 RC2 for 3DSMAX 8 0 RAR

    本文将详细介绍V-Ray 1.5 RC2版本及其在3DS MAX 8.0中的应用。 V-Ray是专业级别的渲染插件,它的主要功能包括光照计算、全局光照、材质系统、动画渲染、物理相机模拟以及先进的图像后期处理等。它以其高效、真实感...

    maven-support-1.5-rc2-sources.jar

    maven-support-1.5-rc2-sources.jar

    prototypejs1.6.1_rc2最新版

    标题中的"prototypejs1.6.1_rc2最新版"指的是PrototypeJS的1.6.1版本的第二个候选发布版(Release Candidate 2,简称RC2),这意味着它是该版本的一个接近最终稳定版的版本,通常在正式版发布之前用于测试和调试。...

    gae-initializer-1.5-rc2.jar

    实测可用

    最新tunsafe

    2019年2月最新下载的tunsafe,版本为1.5-rc2

    gae-initializer-1.5-rc2-sources.jar

    实测可用

Global site tag (gtag.js) - Google Analytics