论坛首页 Web前端技术论坛

prototype 源码解读

浏览 62682 次
该帖已经被评为精华帖
作者 正文
   发表时间:2005-09-16  
prototypes.js 这个东西其实就是一个简单的framework而已,完全是搭建在prototype这个原始类型上的. 上面提到的其他的js文件都是在这个framework上的一个应用而已. 这个框架本身的设计倒是挺新鲜的. 我倒是觉得这个东西是用来参考的, 如果要在这个framework的基础上做东西, 我觉得倒是不适合, 可以将他提供的一些方法作为自己的参看倒是8错. 我也是老板让用才看得这个东西.

1\ 看他的那个ajax.js的源码, 绝对不敢苟同, 如果要研究看懂他的源代码,可就费了劲了, js的object的继承,可以用原始的方式来实现 ObjectA.prototype = new ObjectB(); 使用的时候可能要手工的init()而已. 这样代码组织和理解起来会容易的多.

2\ 这个代码风格和旧的js文件有很大的不同, 包括上面的那几个js文件的几个地方,不知道是不是笔者自己加进去的,代码风格和prototypes.js的就不一样, 要适应它这种写法,还是要一段时间的, 否则写出来的代码就不论不类了.

3\ 如果别人接手你的代码, 那他还要先学习这个东西, 不然就俩眼一么黑了. 还不如自己照着做个简单的轮子, 一两天时间也就搞定了.

不过除了那个ajax.js,其他的倒是蛮不错的, 写的简单明了, 最适合我这种白痴了.

js不是很熟, 不知道我说的对不对?
0 请登录后投票
   发表时间:2005-09-16  
醒来是个大好人!
prototype把js的变量空间(或称closure)和原型(prototype)用到了极致~
不过俺不大敢用它的Form.serialize啊,比如俺的某些input给disable了,再比如某些input的style是display:none,或是一个style是display:none的div包含了N个input,人家IE提交时都忽略不传了,它还傻傻的收集起来,怕怕~
0 请登录后投票
   发表时间:2005-10-03  
liusong1111 写道
醒来是个大好人!
prototype把js的变量空间(或称closure)和原型(prototype)用到了极致~
不过俺不大敢用它的Form.serialize啊,比如俺的某些input给disable了,再比如某些input的style是display:none,或是一个style是display:none的div包含了N个input,人家IE提交时都忽略不传了,它还傻傻的收集起来,怕怕~


这段话说错了,隐藏的表单项确实会提交到服务器的,经过测试了。
我之前也试过的,不过不知为什么得到了相反的结论。
因此,prototype没有之前说的问题,厚厚~
0 请登录后投票
   发表时间:2005-11-20  
老外有更详细和有条理的分析,发给大家看看

http://www.sergiopereira.com/articles/prototype.js.html
0 请登录后投票
   发表时间:2005-11-27  
Object.prototype.extend vs. Object.extend

使用prototype.js 的过程中,重读源码,一些先前的疑问明朗开来。

在1.3.1 的源码中 Object.prototype.extend 实际调用 Object.extend。
前者是一个实例方法,后者是一个静态函数,为什么 prototype 要提供两种形式的extend 呢。

举一个例子,如下的代码:
var object = {p1: v1, p2: v2};
for (p in object); 
    doSomething(object[p]);;


这是很常见的一种应用, for ( p in object) 也就是循环处理对象的属性,这个object 可能是自定义的,你的 doSomething() 函数中的逻辑可能是处理对象的属性。

这时候问题出来了,doSomething() 如果没有经过特殊的处理,有可能会报错,因为 doSomething() 可能无法处理 "extend" 属性, 这个 "extend" 正是 prototype.js 引入的。

就如同java中的abstract类接口发生改变一样,给javascript中的Object的原型增加方法和属性也有可能导致莫名的问题。 Prototype的开发者们一定也考虑到了潜在的问题,果不其然, 1.4.0 preview 源码中再也找不到 Object.prototype.extend 了,所以1.3.1中的 Object.prototype.extend 其实是一个 despatched 方法,可惜文档没有过多说明。

这也给我一个启示,就是改动js 默认对象的原型要慎重。
0 请登录后投票
   发表时间:2006-02-10  
醒来 写道
这也给我一个启示,就是改动js 默认对象的原型要慎重。

但是prototype还是破坏了数组,导致for...in不能用,今天才发现的,google了一下发现老外也讨论过:http://blog.metawrap.com/blog/CommentView,guid,c70de8c7-95ec-45a9-a736-d6ab1eb3c8f2.aspx
0 请登录后投票
   发表时间:2006-03-20  
使用updater的时候 第一次可以从服务器返回一个form的html 赋值到div='formdiv' 上工作 正常; 接下来在该form提交 还是调用updater 当然url和parameter不一样 刷新formdiv 但是 出现提交两次的现在 最好的提交是把url都显示在ie的地址栏里面?
我看prototype的代码是这么一段:
if (this.responseIsSuccess()) {
      if (this.onComplete)
        setTimeout(this.onComplete.bind(this), 10);
    }
不知道怎么让它不二次提交
0 请登录后投票
   发表时间:2006-04-29  
(1)
XXX = {}

(2)
XXX.prototype = function(){...}

(3)
XXX.prototype = {...}

(4)
function xxx(){};
XXX.prototype = new xxx();

(5)
XXX = function(){}

最近也在看prototype的源代码,不过对上面几种创建对象(类)不是很懂,第一个是知道是创建一个对象,但是后面几个就不是很清楚了,不知道有什么分别,请不吝赐教,谢谢
0 请登录后投票
   发表时间:2006-08-28  
macrochen 写道
(1)
XXX = {}

(2)
XXX.prototype = function(){...}

(3)
XXX.prototype = {...}

(4)
function xxx(){};
XXX.prototype = new xxx();

(5)
XXX = function(){}

最近也在看prototype的源代码,不过对上面几种创建对象(类)不是很懂,第一个是知道是创建一个对象,但是后面几个就不是很清楚了,不知道有什么分别,请不吝赐教,谢谢


首先弄清楚function对象和object对象的关系,弄清楚function对象的porotype属性的特点,弄清楚javascript中对象定义属性和方法的方式,个人拙见!
0 请登录后投票
   发表时间:2006-10-13  
我看过prototype.js的Svn中的changlog,发现rails core team在prototype中的活动踪影,dhh等人的名字都在。呵呵。它的send/extend/each等等思想都是直接来自Ruby,对于Rails的使用者来说,使用上觉得天衣无缝。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics