2009-08-09 72 views
29

我正在一个网站上工作,基本上第一次使用JQuery。我以前的项目主要使用MooTools,并且我使用MooTools Class结构编写了一些小部件类。我想将它们移植到JQuery上,但在我看来,对于对象类来说,MooTools没有什么功能。OO JQuery和类

我搜索了一下,并没有发现太多。 Digg似乎有rolled their own,但我不确定这是我应该使用的。有没有更好的办法?人们通常使用JQuery获得面向对象的方法吗?封装UI小部件(或任何功能类结构)的常用方法是什么?

我会后可能MooTools的widget类的假例如:

var ZombatWidget = new Class({ 
    Extends: BaseWidget, 
    widgetPropertyX = 'prop1', 
    widgetPropertyY = 'prop2', 
    attach = function(el) { 
     var f = function() { 
      //do something widgety 
     }; 
     el.addEvent('dblclick',f); 
     el.addClass('widgetized'); 
    } 
}); 

var z = new ZombatWidget(); 
z.attach($('widgetDiv')); 

我所得到的是比大很多,但你的想法。我是否需要将其转换为类/继承构造的prototype方法?你将如何使用JQuery编写这种对象类?

回答

0

问题是......为什么你要离开MooTools它是否适合你的需求?对我来说似乎MooTools工作正常,而且MooTools无法做到的jQuery没有任何功能。 (相反是不正确的)。

不幸的是,jQuery不是为支持传统的OOP而构建的,因为MooTools是这样的,因此您需要将您的Classes编写为jQuery插件。

+0

呃......不,这不是问题。既然你问了,JQuery是项目规范的一部分,这些都不是我写的。如果可以转换,我想把我的MooTools类放在一边,以免我不必为JQuery重写它们。 – zombat 2009-08-09 05:10:12

+0

** @ zombat:** jQuery没有类的功能,您需要在jQuery中重写它们。 – 2009-08-09 05:16:55

0

插件有时会诀窍。

当然,你可以使用足够的mootools来获得它的类/继承模型。通过1.2.3中的document.id“兼容模式”的实现,你可以拥有你的蛋糕并且也可以吃它(我认为 - 我自己并没有这样做。)

4

嗯......有趣。我们有jQuery,这是一个与DOM交互的好工具。这是一个选择工具,您可以编写自己的代码(插件)来修改选定的项目。你可以在这里与你自己的(面向对象的)代码在一个插件中进行交互,以做一些非常酷的事情。

那么,为什么你需要在jQuery中额外的OO功能,除非你想能够从其他jQuery插件继承?

因为你可能有一个插件,可以让你做到以下几点:

$(".spiffyness").yourSpiffyficationPlugin1(); 

而且,虽然已经做了一些很酷的迷死人,你需要在此之上更spiffyness。

因此要从这会导致你的第一个插件继承:

$(".spiffyness").yourSpiffyficationPlugin2(); //plugin inherited from 1 

可是......你会不会做这那里太:

$(".spiffyness").yourSpiffyficationPlugin1().yourSpiffyficationPlugin2(); 

当第二插件只是在第一个这个小小的(但真棒;))额外的东西?

换句话说:就是你想要的,值得为OO纯粹主义而努力吗?或者是jQuery管道机制足够好,也许你需要的一切?

我想说,职责分离和/或你的mootools心态可能是真正的问题。让jQuery做它擅长的事情,使用它强大的管道机制,管理你自己的插件(它可能包含大量的OO内容)......并且当代码仍然干净时,你可以获得很好的结果。

如果您确实认为我在这里想得太简单,那么您的观点的精髓就是一个很好的例子! :-)

要做到这一点,如果你正在做一些真正先进的事情,并且你不会轻易在其他事情上做些事情,那么你也可以将插件委托给你的一个OO类。例如。如:

$.fn.totalAwesomeness = function(options) { 
    var defaults = { 
    mode: 1, 
    title: 'Awesome' 
    }; 
    var opts = $.extend(defaults, options); 
    return this.each(function() { 
    var $this = $(this); 
    var handler = null; 
    if(defaults.mode == 1) 
     handler = new com.myStuff.class1($this); 
    else if(defaults.mode == 2) 
    handler = new com.myStuff.class2($this); //class2 inherits from class1 
    handler.doMagic(); 
    }); 
}; 
+1

Mootools类有助于保持代码简单和结构化。作为一名非JQuery用户,我只能快速浏览一下JQuery插件。即使js体验非常低,Mootools插件类通常也更具可读性。 – jpeltoniemi 2012-05-27 11:54:27

2

您也可以随时使用moo4q - http://moo4q.com/。它增加了对jQuery的MooTools类支持。

+3

值得一提的是,这种方法需要您运行MooTools以及jQuery。你可以做一个自定义的构建来抓取MooTools的'Class'对象,但它需要引入很多其他MooTools的扩展。可能不适合每个人。 – restlessdesign 2012-11-05 16:50:49

2

有第三方JavaScript类实现,提供了非常强大的内省capabilites。我想特别强调JS.ClassJoose。 虽然JS.Class是在Ruby之后建模的,但Joose是在Moose之后建模的。 我不是一个mootools用户,所以我不能评论他们在mootools方面的优缺点。但我会总结他们的主要特点。

JS.Class非常注重模拟Ruby的面向对象功能,并且做得非常好。它提供了一个强大的库,它建立在标准的Ruby库之后,并且还提供了一个集成的包管理和测试框架。

Joose,虽然没有提供测试框架/包管理设施,但在 方面表现优异,先进的属性管理设施,过滤器和更好的内省设施。

两者都有非常好的文档,可以在浏览器和服务器上使用。

2

我刚刚完成了我的小型项目的第一个版本:https://github.com/op1ekun/plOOgins。这完全是关于编写用作Jquery插件的OOP代码。这不是火箭科学,而是我们想在我的工作场所使用的一点东西。也许它会帮助你一点。祝你好运!