行使链式调用,JS链式调用的贯彻情势

相信是真的钻研了一会DSL,发掘了如此几件好玩的事,JavaScript用得最多的三个事物怕是链式调用
(方法链,即Method Chaining)。 有趣的是马丁 弗劳尔提出:

JavaScript DSL 流畅接口(使用链式调用)实例,dsl链式

认真钻研了一会DSL,发掘了那般几件有趣的事,JavaScript用得最多的叁个事物怕是链式调用
(方法链,即Method Chaining)。 有意思的是马丁 Flower建议:
复制代码 代码如下:
 I’ve also noticed a common misconception – many people seem to equate
fluent interfaces with Method Chaining. Certainly chaining is a common
technique to use with fluent interfaces, but true fluency is much more
than that.

非常多人将链式调用等同于流畅接口。但是链式调用是水到渠成接口的一种常用方法,真实的余音回旋不绝接口不唯有这么一丝丝。

DSL 流畅接口

明快接口的初志是创设可读的API,终归代码是写给人看的。

恍如的,轻巧的看一下在先我们是通过措施级联来操作DOM
复制代码 代码如下:
var btn = document.createElement(“BUTTON”);        // Create a
<button> element
var t = document.createTextNode(“CLICK ME”);       // Create a text
node
行使链式调用,JS链式调用的贯彻情势。btn.appendChild(t);                                // Append the text to
<button>
document.body.appendChild(btn);                    // Append
<button> to <body>

而用jQuery写的话,就是那样子
复制代码 代码如下:
$(‘<span>’).append(“CLICK ME”);

等等

于是乎回大家便能够创制一个差不离的身体力行来展现这些最简便易行的DSL
复制代码 代码如下:
Func = (function() {
    this.add = function(){
        console.log(‘1’);
        return this;
    };
    this.result = function(){
        console.log(‘2’);
        return this;
    };
    return this;
});

var func = new Func();
func.add().result();

唯独这看起来疑似表达式生成器。

DSL 表明式生成器

 说明式生成器对象提供一组连贯接口,之后将贯通接口调用调换为对底层命令-查询API的调用。

与此相类似的API,大家得以在部分关于数据库的API中见到:
复制代码 代码如下:
var query =
  SQL(‘select name, desc from widgets’)
   .WHERE(‘price < ‘, $(params.max_price), AND,
          ‘clearance = ‘, $(params.clearance))
   .ORDERBY(‘name asc’);

链式调用有二个标题即是得了,同上的代码里面大家从未终止,那令人很吸引。。加上四个query和end如同是一个不容争辩的结果。

其他

办法级联
代表如下:
复制代码 代码如下:
a.b();
a.c();

DSL
流畅接口(使用链式调用)实例,dsl链式
认真研讨了一会DSL,发掘了如此几件好玩的事,JavaScript用得最多的一个东西怕是链式调用…

链式调用
   
链式调用其实只然则是一种语法招数。它能让您通过录取四个开首操作来达成用少许代码表达复杂操作的指标。该技巧满含八个部分:

复制代码 代码如下:

叁个开立代表HTML成分的指标的厂子。

 I’ve also noticed a common misconception – many people seem to equate
fluent interfaces with Method Chaining. Certainly chaining is a common
technique to use with fluent interfaces, but true fluency is much more
than that.

一堆对那一个HTML成分实行某个操作的方法。

重重人将链式调用等同于流畅接口。不过链式调用是水到渠成接口的一种常用方法,真实的余音回旋不绝接口不仅仅这么一丢丢。

调用链的结构
$函数肩负创造帮衬链式调用的对象

DSL 流畅接口

复制代码 代码如下:

明快接口的初心是创设可读的API,终归代码是写给人看的。

(function() {
    /*
     * 创造三个私有class
     * @param {Object} els  arguments 全体参数组成的类数组
     */
    function _$(els) {
        this.elements = [];             //存放HTML元素
        for(var i=0, len=els.length; i<len; i++) {
            var element = els[i];
            if(typeof element === ‘string’) {
                element = document.getElementById(element);
            }
            this.elements.push(element);
        }
    }
    //对HTML成分可进行的操作
    _$.prototype = {
        each: function() {},
        setStyle: function() {},
        show: function() {},
        addEvent: function() {},
    };   
    //对外开放的接口
    window.$ = function() {
        return new _$(arguments);
    };  
})();

澳门葡京,类似的,简单的看一下以前我们是透过措施级联来操作DOM

由于具有目的都会三番五次其原型对象的性质和议程,所以大家得以让定义在原型对象中的那个方法都回到用以调用方法的实例对象的援引,这样就足以对那么些方法进行链式调用了。

复制代码 代码如下:

复制代码 代码如下:

var btn = document.createElement(“BUTTON”);        // Create a
<button> element
var t = document.createTextNode(“CLICK ME”);       // Create a text
node
btn.appendChild(t);                                // Append the text to
<button>
document.body.appendChild(btn);                    // Append
<button> to <body>

(function() {
    /*
     * 成立一个私有class
     * @param {Object} els  arguments 全部参数组成的类数组
     */
    function _$(els) {
        //…
    }
    //对HTML成分可举办的操作
    _$.prototype = {
        each: function(fn) {        //fn 回调函数
            for(var i=0; i<this.elements.length; i++) {
               
//实施len次,每一遍把三个成分elements[i]用作参数字传送递过去
                fn.call(this, this.elements[i]);
            }
            return this;
        },
        setStyle: function(prop, value) {
            this.each(function(el) {
                el.style[prop] = value;
            });
            return this;
        },
        show: function() {
            var that = this;
            this.each(function(el) {
                that.setStyle(‘display’, ‘block’);
            });
            return this;
        },
        addEvent: function(type, fn) {
            var addHandle = function(el) {
                if(document.addEventListener) {
                    el.addEventListener(type, fn, false);
                }else if(document.attachEvent) {
                    el.attachEvent(‘on’+type, fn);
                }
            };
            this.each(function(el) {
                addHandle(el);
            });
            return this; 
        }
    };
    //对外开放的接口
    window.$ = function() {
        return new _$(arguments);
    }

而用jQuery写的话,正是那样子

})();

复制代码 代码如下:

//———————– test ——–
$(window).addEvent(‘load’, function() {
    $(‘test-1’, ‘test-2’).show()
    .setStyle(‘color’, ‘red’)
    .addEvent(‘click’, function() {
        $(this).setStyle(‘color’, ‘green’);
    });
})

$(‘<span>’).append(“CLICK ME”);

链式调用的主意获取数据
   
使用回调函数从协理链式调用的格局获取数据。链式调用很符合赋值器方法,但对此取值器方法,你大概希望他们回去您要的数量实际不是this(调用该办法的对象).消除方案:利用回调本事回来所要的数据.

等等

复制代码 代码如下:

于是回大家便得以成立一个大约的身先士卒来展现这几个最轻巧易行的DSL

window.API = window.API || function() {
    var name = ‘mackxu’;
    //特权方法
    this.setName = function(name0) {
        name = name0;
        return this;
    };
    this.getName = function(callback) {
        callback.call(this, name);
        return this;
    };
};
//————- test —
var obj = new API();
obj.getName(console.log).setName(‘zhangsan’).getName(console.log);

复制代码 代码如下:

陈设一个协理措施链式调用的JS库
JS库特征:

Func = (function() {
    this.add = function(){
        console.log(‘1’);
        return this;
    };
    this.result = function(){
        console.log(‘2’);
        return this;
    };
    return this;
});

事件: 增加和删除事件监听器、对事件指标举办规划化管理

var func = new Func();
func.add().result();

DOM: 类名管理、样式管理

只是那看起来疑似表明式生成器。

Ajax: 对XMLHttpRequest实行标准化管理

DSL 表明式生成器

复制代码 代码如下:

 表明式生成器对象提供一组连贯接口,之后将贯穿接口调用调换为对底层命令-查询API的调用。

Function.prototype.method = function(name, fn) {
    this.prototype[name] = fn;
    return this;
};
(function() {
    function _$(els) {
        //…
    }
    /*
     * Events
     *      addEvent
     *      removeEvent
     */
    _$.method(‘addEvent’, function(type, fn) {
        //… 
    }).method(‘removeEvent’, function(type, fn) {

如此的API,大家得以在局地关于数据库的API中看看:

    })
    /*
     * DOM
     *      addClass
     *      removeClass
     *      hover
     *      hasClass
     *      getClass
     *      getStyle
     *      setStyle
     */
    .method(‘addClass’, function(classname) {
        //…
    }).method(‘removeClass’, function(classname) {
        //…
    }).method(‘hover’, function(newclass, oldclass) {
        //…
    }).method(‘hasClass’, function(classname) {
        //…
    }).method(‘getClass’, function(classname) {
        //…
    }).method(‘getStyle’, function(prop) {
        //…
    }).method(‘setStyle’, function(prop, val) {
        //…
    })
    /*
     * AJAX
     *      ajax
     */
    .method(‘ajax’, function(url, method) {
        //…
    });

复制代码 代码如下:

    window.$ = function() {
        return new _$(arguments);
    };
    //化解JS库命名争辩难题
    window.installHelper = function(scope, interface) {
        scope[interface] = function() {
            return _$(arguments)
        }
    } 
})();

var query =
  SQL(‘select name, desc from widgets’)
   .WHERE(‘price < ‘, $(params.max_price), AND,
          ‘clearance = ‘, $(params.clearance))
   .ORDERBY(‘name asc’);

小结:

链式调用有三个主题材料正是终止,同上的代码里面大家从不终结,那令人很吸引。。加上一个query和end就像是三个准确的结果。

   
链式调用有利于简化代码的编辑专门的学问,并在某种程度上得以让代码尤其从简、易读。相当多时候使用链式调用能够幸免数十三遍重复使用一个对象变量,进而缩小代码量。假诺想让类的接口保持一致,让赋值器和取值器都协助链式调用,那么你能够在取值器中应用回调函数来缓和获取数据难点。

其他

你恐怕感兴趣的文章:

  • 学习JavaScript设计形式(链式调用)
  • JavaScript DSL
    流畅接口(使用链式调用)实例
  • JavaScript中链式调用之研习
  • JavaScript中二种链式调用完结代码
  • Javascript
    链式调用实今世码(参谋jquery)
  • javascript中的链式调用
  • javascript
    匡助链式调用的异步调用框架Async.Operation
  • JavaScript 异步调用框架 (Part 4 –
    链式调用)
  • 让JavaScript中setTimeout辅助链式操作的不二等秘书籍
  • JavaScript对象链式操作代码(jquery)
  • JavaScript
    对象链式操作测验代码
  • javascript轻便链式调用案例剖判

措施级联
意味着如下:

复制代码 代码如下:

a.b();
a.c();

你可能感兴趣的篇章:

  • 上学JavaScript设计形式(链式调用)
  • JS链式调用的贯彻形式
  • JavaScript中链式调用之研习
  • JavaScript中二种链式调用完成代码
  • Javascript
    链式调用完成代码(参谋jquery)
  • javascript中的链式调用
  • javascript
    协助链式调用的异步调用框架Async.Operation
  • JavaScript 异步调用框架 (Part 4 –
    链式调用)
  • 让JavaScript中setTimeout帮助链式操作的不二秘籍
  • JavaScript对象链式操作代码(jquery)
  • JavaScript
    对象链式操作测验代码
  • javascript轻巧链式调用案例分析

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website