04方法链式调用实现
jQuery的这种管道风格的DSL链式代码,总的来说:
☑ 节约JS代码;
☑ 所返回的都是同一个对象,可以提高代码的效率。
看下面这段链式代码:
<script> $("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') }); </script>
看这个代码的结构,我们或多或少都能猜到其含义: ☑ 找出type类型为button的input元素 ☑ 找到第一个按钮,并绑定click事件处理函数 ☑ 返回所有按钮,再找到第二个 ☑ 为第二个按钮绑定click事件处理函数 ☑ 为第三个按钮绑定toggle事件处理函数
jQuery的这种管道风格的DSL链式代码,总的来说: ☑ 节约JS代码; ☑ 所返回的都是同一个对象,可以提高代码的效率。
通过简单扩展原型方法并通过return this 的形式来实现跨浏览器的链式调用 利用JS下简单的工厂模式,来将所有对于同一个DOM对象的操作指定同一个实例
这个原理就超简单了,如下:
aQuery().init().name()
分解:
a = aQuery()
a.init()
a.name()
把代码分解一下,很明显实现链式调用的基本条件是就要实例对象先创建好,调用自己的方法
<script> aQuery.prototype = { init: function() { return this; }, name: function() { return this; } } </script>
所以我们如果需要链式的处理,只需要在方法内部方法当前的这个实例对象this就可以了,因为返回当前实例的this,从而又可以访问自己的原型了,这样的就节省代码量,提高代码的效率,代码看起来更优雅。但是这种方法有一个问题是:所有对象的方法返回的都是对象本身,也就是说没有返回值,所以这种方法不一定在任何环境下都适合。
虽然Javascript是无阻塞语言,但是他并不是没阻塞,而是不能阻塞,所以他需要通过事件来驱动,异步来完成一些本需要阻塞进程的操作,这样处理只是同步链式,除了同步链式还有异步链式,异步链式jQuery从1.5开始就引入了Promise,jQuery.Deferred后期再讨论。
