zoukankan      html  css  js  c++  java
  • jQuery链式调用

    http://www.imooc.com/code/3402   

    jQuery的核心理念是Write less,Do more(写的更少,做的更多),那么链式方法的设计与这个核心理念不谋而合。那么从深层次考虑这种设计其实就是一种Internal DSL。

    DSL是指Domain Specific Language,也就是用于描述和解决特定领域问题的语言。

    我们看一段链式代码:

    $('input[type="button"]')
        .eq(0).click(function() {
            alert('点击我!');
    }).end().eq(1)
    .click(function() {
        $('input[type="button"]:eq(0)').trigger('click');
    }).end().eq(2)
    .toggle(function() {
        $('.aa').hide('slow');
    }, function() {
        $('.aa').show('slow');
    });

    看这个代码的结构,我们或多或少都能猜到其含义:

      ☑  找出type类型为button的input元素

      ☑  找到第一个按钮,并绑定click事件处理函数

      ☑  返回所有按钮,再找到第二个

      ☑  为第二个按钮绑定click事件处理函数

      ☑  为第三个按钮绑定toggle事件处理函数

          那么可见jQuery的Internal DSL形式带来的好处——编写代码时,让代码更贴近作者的思维模式;阅读代码时,让读者更容易理解代码的含义;应用DSL可以有效的提高系统的可维护性(缩小了实现模型和领域模型的距离,提高了实现的可读性)和灵活性,并且提供开发的效率。

    jQuery的这种管道风格的DSL链式代码,总的来说:

      ☑  节约JS代码;

      ☑  所返回的都是同一个对象,可以提高代码的效率。

    通过简单扩展原型方法并通过return this的形式来实现跨浏览器的链式调用。利用JS下的简单工厂方法模式,来将所有对于同一个DOM对象的操作指定同一个实例。

    这个原理就超简单了,如下代码:

    aQuery().init().name()

    分解:

    a = aQuery();
    a.init()
    a.name()

    把代码分解一下,很明显实现链式的基本条件就是要实例对象先创建好,调用自己的方法。

    aQuery.prototype = {
        init: function() {
            return this;
        },
        name: function() {
            return this
        }
    }

          所以我们如果需要链式的处理,只需要在方法内部方法当前的这个实例对象this就可以了,因为返回当前实例的this,从而又可以访问自己的原型了,这样的就节省代码量,提高代码的效率,代码看起来更优雅。但是这种方法有一个问题是:所有对象的方法返回的都是对象本身,也就是说没有返回值,所以这种方法不一定在任何环境下都适合。

          虽然Javascript是无阻塞语言,但是他并不是没阻塞,而是不能阻塞,所以他需要通过事件来驱动,异步来完成一些本需要阻塞进程的操作,这样处理只是同步链式,除了同步链式还有异步链式,异步链式jQuery从1.5开始就引入了Promise,jQuery.Deferred后期再讨论。

  • 相关阅读:
    函数式宏定义与普通函数
    linux之sort用法
    HDU 4390 Number Sequence 容斥原理
    HDU 4407 Sum 容斥原理
    HDU 4059 The Boss on Mars 容斥原理
    UVA12653 Buses
    UVA 12651 Triangles
    UVA 10892
    HDU 4292 Food
    HDU 4288 Coder
  • 原文地址:https://www.cnblogs.com/darr/p/5124324.html
Copyright © 2011-2022 走看看