繁体   English   中英

jQuery和面向对象的Javascript-如何正确执行?

[英]jQuery and Object Oriented Javascript - How do I do it properly?

我对jQuery有相当的经验,但是我只想学习面向对象的Javascript,并想确保自己做对了。

这是到目前为止我正在做的一个例子...我很高兴关于如何改善方法的提示/建议:

// create a class for collapsable fieldsets
window.CollapsableFieldset = (function() {
  function CollapsableFieldset(jQObject) {
    // look for all the legend tags within this fieldset
    jQObject.find("legend").click(function(event) {
      // add or remove the "open" class to the fieldset
      return jQObject.toggleClass("open");
    });
  }
  return CollapsableFieldset;
})();

jQuery(document).ready(function() {
  return $("fieldset.collapsable").each(function(i, element) {
    return new CollapsableFieldset($(element));
  });
});

因此,基本上,我正在创建一个定义所需行为的类,然后在jQuery块中,选择每个匹配的对象,并使用该对象作为参数创建该类的新实例。

这不是面向对象的javascript。

在进行原型制作之前,我先说一句:在CollapsableFieldset中使用闭包是不必要且麻烦的。 确实,(function(){})()模式中没有任何变量。 您可以将以下内容重写为:

window.CollapsableFieldset = function (jQObject) {
  jQObject.find('legend').click(function(event) {
    return jQObject.toggleClass('open');
  });
}

现在,您可以使用函数构造函数在javascript中创建类,其中的“ this”关键字定义“ new”语句将产生的对象:

function CollapsableFieldset (jQObject) {
  // This is the function constructor.
  this.field = jQObject;
}
CollapsableFieldset.prototype.findAndToggle = function (tag, cssclass) {
  // This defines a method "findAndToggle" on the CollapsableFieldset type.
  this.field.find(tag).click(function(event) {
    return this.field.toggleClass(cssclass);
  });
};

jQuery(document).ready(function() {
  return $("fieldset.collapsable").each(function(i, element) {
    var colFieldset =  new CollapsableFieldset($(element));
    return colFieldset.findAndToggle('legend', 'open');
  });
});

请记住,面向对象的javascript并非总是最佳的解决方案。

一种选择是使用Jquery UI的小部件工厂并将行为封装在小部件中。 http://wiki.jqueryui.com/w/page/12138135/Widget-factory

您正无缘无故地使用立即调用的函数表达式,您的代码在功能上等效于:

  function CollapsableFieldset(jQObject) {
    // look for all the legend tags within this fieldset
    jQObject.find("legend").click(function(event) {
      // add or remove the "open" class to the fieldset
      return jQObject.toggleClass("open");
    });
  }

“构造函数”不会返回用new调用时创建的对象,它没有利用原型继承的优势,因此没有必要使用new

该函数返回的对象未分配任何内容,那么返回任何内容有什么意义呢?

> jQuery(document).ready(function() {  
>     return $("fieldset.collapsable").each(function(i, element) {
>         return new CollapsableFieldset($(element));
>     });
> });

new CollapsableFieldset(...)返回的对象在哪里?

顺便说一句,没有必要使用以下方法创建全局变量:

window.varName...

什么时候

var varName ...

这样做好多了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM