资讯专栏INFORMATION COLUMN

jQuery代码组织

BlackHole1 / 799人阅读

摘要:代码之间通过,完成消息传递。封装代码组织的第一步就是把代码分成不同的部分。使用对象进行封装优点解决消除匿名函数,以配置参数为中心,更方便去重构和重用。消除了匿名函数的使用。在上面的例子中,我们自我执行一个匿名函数,返回一个对象。

核心原则:

1、代码必须分成不同的功能模块——服务和模块,避免把所有的代码都放在一个$( document ).ready()里。
2、不要重复代码。识别不同功能模块里面的相同代码并提取出来用继承的方法来避免重复。
3、尽管jquery是以DOM为中心,但javascript不是全部关于DOM的,不是所有的功能块需要或应该有一个DOM表示。
4、松耦合。代码之间通过 custom event,pub/sub完成消息传递。

封装

代码组织的第一步就是把代码分成不同的部分。

使用对象进行封装

优点:解决消除匿名函数,以配置参数为中心,更方便去重构和重用。比如对事件处理函数,定义为_开头的函数,隐含其为工具函数或私有函数,一个简单的实例:

// An object literal
var myFeature = {
    myProperty: "hello",
 
    myMethod: function() {
        console.log( myFeature.myProperty );
    },
 
    init: function( settings ) {
        myFeature.settings = settings;
    },
 
    readSettings: function() {
        console.log( myFeature.settings );
    }
};
 
myFeature.myProperty === "hello"; // true
 
myFeature.myMethod(); // "hello"
 
myFeature.init({
    foo: "bar"
});
 
myFeature.readSettings(); // { foo: "bar" }

上面例子就是通过赋值给一个对象来进行封装的,这个对象有几个属性和方法,所有的属性和方法都是公共的。
如何将对象应用在Jquery编写的程序中,一个典型的Jquery程序如下:

// Clicking on a list item loads some content using the
// list item"s ID, and hides content in sibling list items
$( document ).ready(function() {
    $( "#myFeature li" ).append( "
" ).click(function() { var item = $( this ); var div = item.find( "div" ); div.load( "foo.php?item=" + item.attr( "id" ), function() { div.show(); item.siblings().find( "div" ).hide(); }); }); });

针对上面的代码,起码可以优化几点:
将和功能无关的部分独立,可以把url作为配置参数,最后链式操作也可以优化。

// Using an object literal for a jQuery feature
var myFeature = {
    init: function( settings ) {
        myFeature.config = {
            items: $( "#myFeature li" ),
            container: $( "
" ), urlBase: "/foo.php?item=" }; // Allow overriding the default config $.extend( myFeature.config, settings ); myFeature.setup(); }, setup: function() { myFeature.config.items .each( myFeature.createContainer ) .click( myFeature.showItem ); }, createContainer: function() { var item = $( this ); var container = myFeature.config.container .clone() .appendTo( item ); item.data( "container", container ); }, buildUrl: function() { return myFeature.config.urlBase + myFeature.currentItem.attr( "id" ); }, showItem: function() { myFeature.currentItem = $( this ); myFeature.getContent( myFeature.showContent ); }, getContent: function( callback ) { var url = myFeature.buildUrl(); myFeature.currentItem.data( "container" ).load( url, callback ); }, showContent: function() { myFeature.currentItem.data( "container" ).show(); myFeature.hideContent(); }, hideContent: function() { myFeature.currentItem.siblings().each(function() { $( this ).data( "container" ).hide(); }); } }; $( document ).ready( myFeature.init );

改完之后,可以看到:
1、我们把功能分成了很小的方法。以后如果我们想改变内容的展示,它是明确的,改变它。在原代码中,是很难做到的。
2、消除了匿名函数的使用。
3、将配置选项从代码的主体中移动,并将它们放在中心位置。
4、消除了外链的约束,使得代码更容易重构。

模块模式

模块模式克服了对象封装的一些局限性,为变量和函数提供了隐私,同时公开了一个公共接口。

// The module pattern
var feature = (function() {
 
    // Private variables and functions
    var privateThing = "secret";
    var publicThing = "not secret";
 
    var changePrivateThing = function() {
        privateThing = "super secret";
    };
 
    var sayPrivateThing = function() {
        console.log( privateThing );
        changePrivateThing();
    };
 
    // Public API
    return {
        publicThing: publicThing,
        sayPrivateThing: sayPrivateThing
    };
})();
 
feature.publicThing; // "not secret"
 
// Logs "secret" and changes the value of privateThing
feature.sayPrivateThing();

在上面的例子中,我们自我执行一个匿名函数,返回一个对象。在函数的内部,我们定义了一些变量。因为变量被定义在函数的内部,除非我们把它们放在返回对象中,否则我们就无法访问它们。这意味着函数以外的任何代码无法访问的变量privateThing或变量changePrivateThing。然而,sayprivatething可以访问并获得privatething和changeprivatething,因为都是在相同的范围内定义为sayprivatething。
这种模式是强大的,因为你可以从变量名称中收集,它可以给你私人的变量和函数,同时暴露一个有限的API组成的返回的对象的属性和方法。
下面是一个修订版的前面的例子,展示了如何我们可以使用模块的格局:

// Using the module pattern for a jQuery feature
$( document ).ready(function() {
    var feature = (function() {
        var items = $( "#myFeature li" );
        var container = $( "
" ); var currentItem = null; var urlBase = "/foo.php?item="; var createContainer = function() { var item = $( this ); var _container = container.clone().appendTo( item ); item.data( "container", _container ); }; var buildUrl = function() { return urlBase + currentItem.attr( "id" ); }; var showItem = function() { currentItem = $( this ); getContent( showContent ); }; var showItemByIndex = function( idx ) { $.proxy( showItem, items.get( idx ) ); }; var getContent = function( callback ) { currentItem.data( "container" ).load( buildUrl(), callback ); }; var showContent = function() { currentItem.data( "container" ).show(); hideContent(); }; var hideContent = function() { currentItem.siblings().each(function() { $( this ).data( "container" ).hide(); }); }; items.each( createContainer ).click( showItem ); return { showItemByIndex: showItemByIndex }; })(); feature.showItemByIndex( 0 ); });

原文:Code Organization Concepts

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86070.html

相关文章

  • webpack组织模块的原理 - external模块

    摘要:所以通常情况下当你的库需要依赖到例如,这样的通用模块时,我们可以不将它打包进,而是在的配置中声明这就是在告诉请不要将这个模块注入编译后的文件里,对于我源代码里出现的任何这个模块的语句,请将它保留。 这篇文章讨论Webpack打包library时经常需要用到的一个选项external,它用于避免将一些很通用的模块打包进你发布的library里,而是选择把它们声明成external的模块,...

    Lavender 评论0 收藏0
  • JavaScript代码组织结构良好的5个特点[reuqire.js]

    摘要:可重用的代码变得更可靠,单元测试的数量增加了倍也是一个因素。模块不应依赖全局变量为了进一步加强我们的代码库,我们已经几乎完全消灭了全局变量除了由提供的全局变量,如和。 随着JavaScript项目的成长,如果你不小心处理的话,他们往往会变得难以管理。我们发现自己常常陷入的一些问题: 当在创建新的页面时发现,很难重用或测试之前写的代码。 当我们更深处地研究这些问题,我们发现根本原因是无效...

    wushuiyong 评论0 收藏0
  • [转载]jQuery插件开发详细教程

    摘要:本教程可能不是最精品的,但一定是最细致的。插件开发下面我们就来看第二种方式的插件开发。然后我们的插件代码在这个方法里面展开。 要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统。这好比大公司们争相做平台一样,得平台者得天下。苹果,微软,谷歌等巨头,都有各自的平台及生态圈。 学会使用jQuery并不难,因为它简单易学,并且相信你接触...

    kevin 评论0 收藏0
  • 前端模块及依赖管理的新选择:Browserify

    摘要:它的关键能力,是模块及依赖管理。其次,保持局部变量风格。我们很习惯通过和这样的全局变量来访问这样的库,但如果使用,它们都应只作为局部变量这里的就只存在于这个文件的代码范围内独立的作用域。 引言 1. manually 以前,我新开一个网页项目,然后想到要用jQuery,我会打开浏览器,然后找到jQuery的官方网站,点击那个醒目的Download jQuery按钮,下载到.js文件,然...

    evin2016 评论0 收藏0
  • jquery组织架构图插件

    摘要:点击加减号按钮可以显示与隐藏当前节点的子节点。源码解析插件的写法这里的可以取到调用时传的参数最后附上地址欢迎 jquery插件 说明 jquery插件皆可用于react,使用方法:react中使用jquery插件 效果图 showImg(https://segmentfault.com/img/bVX24E?w=895&h=756); 使用方法: $(.orgWrap).lenChar...

    sydMobile 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<