论坛首页 Web前端技术论坛

我为什么选择mootools,抛弃了prototype. (mootools与prototype 核心代码分析)

浏览 90700 次
该帖已经被评为精华帖
作者 正文
   发表时间:2007-09-13  
我觉得fins同学的一些说法会造成没有深入使用这几个框架的朋友的误解。因为这几个框架的思想是不一样的,所以它们的语法也是不同的。fins同学的评价似乎更像从Java的OO想法来评价几个js框架。
其实,moo一开始的想法就是light weight,所以它的很多语法其实就是没有语法。fins说的json语法,其实就是js里面的散列对象嘛,javascript语法本来就是这个样子呀,不包装就是这样。而这种方式如果写的好读起来很像DSL,很舒服,moo充分发挥了这个好处。
prototype和JQuery都没有强调继承这样的概念。javascript的强大很大就来自它的原形继承,如果要用好它就要利用好原形继承。prototype在这方面很像Ruby,比如Enumerable,这是一种按照行为的抽象,很符合Ruby/Python里面Module的想法,并非所有行为都要抽象到一个对象再继承,行为本身也可以抽象再混入。
JQuery我觉得像Python。write less do more这个想法也比较pythonic。在这个框架中有很强的函数式编程的味道,其实javascript已经具备了函数式编程的语法能力,所以使用FP的强大是JQuery受欢迎的原因之一。

说回来,还是流派原因。moo的产生比前两者要晚。prototype已经开始走大而全的路子了,而且配套的script.aculo.us也是越来越臃肿(而且这个特效库的代码质量的确不怎么好),但是要看到RoR里面使用RJS简化Ajax应用开发都得益于这些大而全的库,所以我们也没什么可抱怨的,只能说没有使用RoR少享受点便利吧。JQuery继续保持它的优美,插件也越来越多,我了解到的很多使用Django进行Web开发的朋友都在用JQuery。而moo,越来越受欢迎,我们也要认真关注它的体积,如果它能持续保持苗条,那么轻量级Web项目就很有可能越来越多的选用它。
每年学一门新语言,学两三个新框架,肯定是有益的。fins转阵营说明你也在拥抱变化呀:D
0 请登录后投票
   发表时间:2007-09-13  
其实我没有比较他们内部的实现,也没有比较他们的风格,我的比较很简单.
就是把同样的函数拿出来比, 看谁的用起来更舒服,或者谁考虑的更周全.

至于JQUERY我多次重申 我对它不了解,只是简单的看了看,归根结底我是不喜欢它的晦涩 和故弄玄虚.
不知道你听过"老罗语录"没,里面关于对金庸 古龙的评价那段我觉得说的很有道理.
古龙的文字第一次看到又酷又炫,但是时间久了人们才发现,还是金庸的朴实无华更动人心(当然他讲的要有意思得多,如果没听过建议听听.
老罗还在里面引用了两句话,我觉得更是精辟:"时间对于别出心裁的小花招是最无情的","过份依赖这些稀奇古怪的小花招导致结果价值受到削弱,经不起时间考验".
0 请登录后投票
   发表时间:2007-09-13  
对于熟悉html/css/xpath的同志来说,jquery当然是不二之选。其实自cssQuery以来,各个框架都在拼命引进使用selector或query的方式。这其实很简单,因为它比传统的桌面编程模式先进和便利许多。这是我2005年的时候做了半年winforms开发深感痛苦得到的结论。

BTW,比较框架的时候,应该要看这个框架的设计思路和目的。例如prototype本意是轻量级的基础库,拿它直接跟ext去pk,就不是很好。

再有,framework的感觉与开发者本身所属社群有关,大体如下:

prototype:不用说了,ruby味道的
mochikit:正宗的Python味道
dojo:java风味
jquery:CSS/XPath的风味
jsvm:java味道
jsi:偏java风味
……

相对来说各个社群的开发者会更喜欢接近他们口味的js框架。
1 请登录后投票
   发表时间:2007-09-13  
相对来说各个社群的开发者会更喜欢接近他们口味的js框架

这个观点我非常认同

但是我觉得 如果moo加入了强大的selector后 一定会比jquery出色.



对于jquery的一条语句来说 例如

$("#mmmmmm aaa.xxx").FFFFFFFFFFFFFF.....


其实你欣赏的是 对"#mmmmmm aaa.xxx"的支持 但是你确定你对他 .后面的那些FFFFFFFFFFFFFFFFFFFf...是喜欢的吗??


具体点
$(document).ready(function(){   
            $(".fold .fold-button img").click(function(){   
                $(".expand",$(this).parents("div.fold")).toggle();   
            });   
        });  


我也喜欢通过 (".fold .fold-button img") 取得对象的方式
但是后面的 .click(function(){  
                $(".expand",$(this).parents("div.fold")).toggle();  
            });  
你确定你第一眼就能知道他是做什么的吗?? 就算知道, 你确定这样的实现除了代码数量少之外 还有其他什么有点吗??
0 请登录后投票
   发表时间:2007-09-13  
另外多问一句 我对selector的理解一直不到位
在我看来 selector只是一个帮助我们取得页面元素的工具
为我们取得页面元素提供了一个更好的 更灵活的手段.

我这样的理解对吗?

如果不对那么 他更深层次的用法还有什么呢? (别让我去google 因为gooogle过 可能是找的关键字不对,没什么收获)

如果我说的对, 那么出色的selector可以成为一个js框架的亮点,而不应该成为决定他优劣的根本.对吧? 所以我并不认为jquery有绝对的优势.
0 请登录后投票
   发表时间:2007-09-13  
我觉得JQuery的优秀之处在于他把AJAX程序员所需的,都以最方便的方式提供给你了。例如:selector, XHR, event binding, dom manipulation

而不是像楼主那样把它作为一个OO框架,JQ不是用来写PersonClass的。你想在JQ上构建另一个类库,那明显是你选工具的思路错误了。就像在说“在struts上构建一个MVC框架太麻烦了,还不如我直接在servlet上构建呢”

在某一楼楼主说了一句很搞笑的话,什么JQuery可以提供的,其它框架也可以提供(原句我懒得去找了)。那MOOTOOLS呢?你凭什么觉得它的东西别人抄不到呢? JQuery在这一点的优秀之处在于它比较别人更早提供大家需要的东西,例如像domready,不知道是我之前不知道什么是什么,反正就我所知JQ是第一个提供的,其它框架只是跟尾而已。
像PROTOTYPE从1。4之后就不见有什么新东西了,它在新的release notes里的东西基本上是在JQ早几版的release notes中出现过的。至于MOOTOOLS就不清楚了。

引用

$("#mmmmmm aaa.xxx").FFFFFFFFFFFFFF.....

其实你欣赏的是 对"#mmmmmm aaa.xxx"的支持 但是你确定你对他 .后面的那些FFFFFFFFFFFFFFFFFFFf...是喜欢的吗??

我的回答同样是,JQ不是给你写PersonClass的, 是给你写应用的。别人怎样我不知道,就我自己的使用感觉,JQ提供的接口真的很实用,在我做的为数不多的应用里,这些接口都觉得用得很爽
具体一点的说
$(document).ready(function(){     
       $(".fold .fold-button img").click(function(){     
             (".expand",$(this).parents("div.fold")).toggle();     
       });     
}); 

直的太优美了。不赞成的话用别的代码写写相同的功能对比一下吧
0 请登录后投票
   发表时间:2007-09-13  
fins 写道
radar 写道
fins 写道
"另外mootools的命名不是很好,为什么不用package的概念呢?"
因为他不想成为 又一个dojo 又一个yui吧
毕竟简单轻巧才是他最求的吧.

其实我觉得JS里搞命名空间实际意义不是很大 至少现在看来是这样.

因为我们一般很少会写太过复杂的js代码,而且很少会在同一个页面内同时使用两个以上的大型js框架


package怎么了?dojo的问题是package吗?
我指的是,mootools占用了太多的顶层变量名。
$extend
Ajax
$
fx
... ...

万一你不小心定义一个
$开头的变量呢?


可能这不是主要问题,如果都放到
var mootools={};下就没这个问题了啊!为什么不呢?


我明白你的意思.
我已经回答这个问题了.
prototype也是直接使用顶层的变量名 $ ajax Element等等
以前我写东西也很注意这些,但是后来发现意义不是很大.

1 冲突的概率很小 因为你很少会将多个js框架在同以页面中混合使用
而在每一个方法前加上moo或者mootools会解决一些问题,但是他也带来了麻烦,他解决的问题是不常遇到的,带来的麻烦却是人人都能感受到的.

2 moo或者prototype的作者用意很明显,就是希望让使用者感觉不到js框架的存在,让大家把框架当作js语言本身的一部分.
他们希望通过自己的努力来改变js的开发方式.


3 当一个框架或是语言或是其他什么东西 足够强大足够出色,已经成为事实标准的时候, 使用者是会妥协的.
举一个不太恰当的例子, 你有没有质疑过
"js里为什么不给 function加一个命名空间, 例如 JS.function, 这样我就可以自由的使用 function作为变量名了"
为什么你不会有这样的质疑? 因为他是规定 他是标准, 不喜欢? 那你可以不用js啊.

其实所有这类框架都有一定的排他性. 尤其是jquery prototype moo这类相对低层的js框架, 他们不希望和竞争对手共存.
你有"$()" 那我就要用我自己的 更好的"$()"打败你,道理就是这么简单.


而让各种低层框架能够互相妥协,能够共存是 更上层的框架去做的事, 例如EXT 和他的bridge.



当然,我从来不否认这样做的缺点,但是这些缺点目前看来不是问题的关键.


这就更加让人无语了。。。
特别是
引用

3 当一个框架或是语言或是其他什么东西 足够强大足够出色,已经成为事实标准的时候, 使用者是会妥协的

那xml的namespace和java的package都不用了,谁先发围谁作主好了。
人家JQuery就完全没有这种问题了。

阁下是太过情人眼里出西施了,把缺点都说成优点了,列出来的都是霸王道理。。。

0 请登录后投票
   发表时间:2007-09-13  
其实,不考虑运行速度的话,我感觉用prototype、jq还是moo都差不多,都是为了提高我们的开发效率
0 请登录后投票
   发表时间:2007-09-13  
to Sam1860:

我最近怎么总是被卷入这样那样的争论中呢. 无奈了.
你喜欢jquery你就用呗 我只是说一下我不喜欢的原因.
你干嘛拿出一副声讨我的姿态啊,没必要那么激动的.
而且我都说了,我对jquery不了解, 我核心比较的也不是jquery啊 是moo 和prototype.
我更没说过:大家都别用prototype 和jquery了, 跟我一起用moo吧


另外我在比较 prototype和moo 时 一直是在拿他们都有的基础的功能去比的.
你干嘛老拿jq有而别人没有的功能来说啊. 这公平吗?


你说:
而不是像楼主那样把它作为一个OO框架,JQ不是用来写PersonClass的。你想在JQ上构建另一个类库,那明显是你选工具的思路错误了。

我就想找一个可以帮助我写出更高质量的JS代码的框架, 我这个想法有什么不可以的吗?
如果可以,那么我觉得必要的OO特性是必须的,因为我个人的习惯就是写一些OO的js代码,但是又不用太oo,那么我选择moo有错吗?


你说:
JQuery在这一点的优秀之处在于它比较别人更早提供大家需要的东西

早就一定好?


你说:
直的太优美了。不赞成的话用别的代码写写相同的功能对比一下吧

我举个例子哈.框架1 和框架2 都能实现一个功能.

框架1用了两个方法,是这样实现的:
function a : 3行. 其中有一行是调用b
function b : 30行.

框架2也用了两个方法,是这样实现的:
function a : 5行. 其中有一行是调用b
function b : 10行.

然后你拿两个框架的方法a做对比, 得出框架1 比框架2 简洁,这合适吗?

我自己封装过类似你例子中的那种折叠展开的代码, 封完了就一行:  toggleBar(a);
你能说我比jq moo 的作者都牛吗???


你说:
这就更加让人无语了。。。 

不是我的话让你无语了,是事实让你无语了.
我说: 冲突的概率很小 因为你很少会将多个js框架在同以页面中混合使用
这话不对吗?有谁会在一个页面中混合多种js框架? 就算有 这样的页面多吗?


我说: moo或者prototype的作者用意很明显,就是希望让使用者感觉不到js框架的存在,让大家把框架当作js语言本身的一部分.
这句话不对吗?请举反例.

我说: 这类相对低层的js框架, 他们不希望和竞争对手共存
这不对吗? 只有ext 那种相对上层一些的框架 才会渴望和更多的低层框架兼容共存呢.


3 当一个框架或是语言或是其他什么东西 足够强大足够出色,已经成为事实标准的时候, 使用者是会妥协的
这句话肯定是正确的,只是你认为用在这里不对.
当然,你可以有不同观点,但是你举的例子太不恰当了.

xml的namespace和java的package的存在, 是因为如果没有他们,那么代码之间的冲突将是不可避免的,

但是我这里所说的是有前提的:
由于有了"冲突的概率很小 因为你很少会将多个js框架在同以页面中混合使用",这条做保障,所以轻量级js框架中,package不是必须的.
ext dojo要有包的概念, 因为本身他自己的文件 自己的"类"就特别多, 分包便于开发和管理.


好了 不争论了

我的观点表达的很清楚了 你可以提出你的观点, 但是别一副声讨的姿态. 好吗 有话好好说呗
0 请登录后投票
   发表时间:2007-09-13  
赞同fins的意见。对css,xhtml,javascript还算了解。但是实际使用jquery的时候,感觉你写的不是javascript,有种被xx的感觉。prototype在javascript原有的基础上做了一个小小的封装,这种风格我喜欢,但是确实在基础上mootools是有比较大的差距。再加上selector就更爽了。

我觉得一个js框架,最好的是在js原有语义的基础上做一些功能的加强。提供方便。而不是,想jquery一样,$()返回的是jquery对象而不是dom对象本身。这样会增加学习曲线。而且会造成,写了很长时间javascript,但是对javascript本身一点都不了解的局面。
0 请登录后投票
论坛首页 Web前端技术版

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