javascript插件 - 面向对象?

时间:2010-03-08 21:41:02

标签: javascript jquery singleton module-pattern

介绍

你好,

我正在尝试在javascript中开发一些插件 / 对象,这将控制某些对象的某些属性。它还将使用jQuery来简化开发。

主意

这是伪代码给你一个想法,因为我不能用英语用正确的词语真正描述它,所以不可能去google找出我想要使用的东西(并学习)。

I will have plugin (maybe object?) with some variables and methods:

  plugin hideshow(startupconfig){
    var c, //collection
    add: function(what){
      c += what;
    },
    do: function(){
      c.show().hide().stop(); //example code
    }
  }

我将以这种方式使用它(或 sort-of ):

  var p = new Plugin();

  p
   .add($('p#simple'))
   .add($('p#simple2'))
   .do();

注释

我不是真的在寻找jQuery插件教程 - 它更像是在javascript中使用文档中的一个对象,jQuery只是因为它将用于修改dom和简化选择器,jQuery插件可能只是为了那个小函数add

我正在寻找一些东西,它将位于我的文档之上,并根据计时器或用户操作或其他任何方式从itselft调用函数。

问题

  1. 我真的不知道从这个对象/插件的构造开始
  2. 我不确定如何维护一个变量,即jQuery对象的集合(类似于$('#simple, #simple2');
  3. 我可能希望用$.fn.addToPlugin来使用jQuery来使用对象的链接,但这应该很简单(实际上只是each( p.add($(this)); )
  4. 我最大的问题显然是我无法解释我想要的东西。
  5. 我希望我有任何意义,想法,链接或建议。

    修改

    就是这样的,我只是无法弄清楚它是如何在javascript中调用/使用的 - 伪PHP中的例子:

    class Foo() {
      $collection;
      $timer, $action;
    
      function onTimer(){
        foreach($collection as $e){
          $e->someAction();
        }
      }
    
      function add($e){
        $collection[] = $e;
      }
    
      function start(){
        $timer->start( onTimer() );
      }
    
      function->stop(){
        $timer->stop();
      }
    }
    
    var f = new Foo();
    
    Foo.add(something);
    Foo.start();
    

2 个答案:

答案 0 :(得分:3)

看看Plugins/Authoring。我会说你提出的API并不是真正的“jQuery方式”。更可能是:

$("#simple, #simple2").hideandshow();

起点是:

jQuery.fn.hideandshow = function() {
  return this.each(function(){
    $(this).show().hide().stop();
  });
};

你已经基本完成了。

现在调用这一系列事件也没有意义,但这是另一个问题。

现在链接方法变得更有趣了,我想这就是“单例”的用武之地。现在在jQuery的情况下 - 至少对于jQuery插件 - 状态存储在jQuery对象本身上一般规则:

jQuery.effects = [];
jQuery.addeffect = function() {
  for (int i=0; i<arguments.length; i++) {
    if (typeof this[arguments[i]] == "function") {
      this.effects.push(arguments[i]);
    }
  }
};

并通过插件访问:

jQuery.fn.do = function() {
  var effects = this.effects;
  return this.each(function(){
    var ob = $(this);
    for (int i=0; i<effects.length; i++) {
      ob = ob[effects[i]]();
    }
  });
};

然后允许:

$.addeffect("hide", "show", "stop");
$("#simple, #simple2").do();

现在这具有能够将参数传递给这些效果的限制。不太清楚如何解决这个问题。

答案 1 :(得分:2)

如果您想在Javascript中编写单例,YAHOO module pattern应该会显示您需要的所有内容。