美文网首页web前端JS相关
js的链式调用分析

js的链式调用分析

作者: 一点红3340 | 来源:发表于2017-07-21 17:58 被阅读54次

前言

在做一个组件化开发的案例时在主逻辑中用到了链式调用的方法,目的是为了让代码更简洁易读,减少代码量,但是对各个构造函数末尾的" return this "很是疑惑,未明其意。查了书才明白这句话的作用。

什么是链式调用

其实jquery里面的自带函数都可以链式调用,比如:

point.width(100px).height(100px);
$(this).setStyle('color', 'red').show();

上面两个语句都是链式调用

分析

链式调用其实是两个部分:

1.操作对象(也就是被操作的DOM元素,如上例的$(this))

2.操作方法(具体要做什么事情,如上例的setStyle和show)

这是jquery中$函数的设计方法:

function $(){
  var elements = [];
  for(var i= 0,len=arguments.length; i<len; i++){
    var element = arguments[i];
    if(typeof element==='string'){
      element = document.getElementById(element);
    }
    if(arguments.length==1){
      return element;
    }
    elements.push(element);
  }
  return elements;
}

现在可以将这个函数改造为下面这样:

(function(){
  function _$(els){
    this.elements = [];//把那些元素作为数组保存在一个实例属性中,
    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);
    }
  }
 
  _$.prototype = {
    each: function(fn){
      for(var i= 0,len=this.elements.length; i<len; i++){
        fn.call(this, this.elements[i]);
        return this; //在每个方法的最后return this;
      }
    },
    setStyle: function(prop, val){
      this.each(function(el){
        el.style[prop] = val;
      });
      return this; //在每个方法的最后return this;
    },
    show: function(){
      var that = this;
      this.each(function(el){
        that.setStyle('display', 'block');
      });
      return this; //在每个方法的最后return this;
    },
    addEvent: function(type, fn){
      var add = function(el){
        if(window.addEventListener){
          el.addEventListener(type, fn, false);
        }else if(window.attachEvent){
          el.addEvent('on'+type, fn);
        }
      };
      this.each(function(el){
        add(el);
      });
      return this; //在每个方法的最后return this;
    }
  }
  window.$ = function(){
    return new _$(arguments);
  }
})();

上面的代码是让定义在构造函数的prototype属性中的对象都返回用来调用方法的那个实例的引用(在上例中也就是返回" -$() "函数的实例),这样的话,如果每次都return this,那么链式调用就可以不断进行下去。

实际使用

比如在我这次组件式开发中用的是下面这样的形式:

构造函数:

/*JS主逻辑*/
var H5 = function(){
    this.addPage(){//新增一页
        /*代码和方法*/
        return this;
    }
    
    this.addComponent(){//新增一个组件
        /*代码和方法*/
        return this;
    }
 
    this.loader(){
        /*代码和方法*/
        return this;
    }
}

调用:

$(function(){
    var h5 = new H5();
    h5.addPage()
          .addComponent()
          .addComponnet()
          .addComponent()
          .addComponent()
      .addPage()
          .addComponent()
          .addComponnet()
          .addComponent()
          .addComponent()
      ...//后续调用
})

这样使用可以避免多次重复使用一个变量对象,减少代码量,使逻辑更清晰。

相关文章

  • js的链式调用分析

    前言 在做一个组件化开发的案例时在主逻辑中用到了链式调用的方法,目的是为了让代码更简洁易读,减少代码量,但是对各个...

  • 自制jquery-第一篇

    1, jquery.js脚本文件 2,实现链式调用的原理 非链式调用:$xxx.addClass("active"...

  • js链式调用

  • js链式调用

    关键词:链式调用 我们都很熟悉jQuery了,只能jQuery中一种非常牛逼的写法叫链式操作 那这是如何实现的呢,...

  • js链式调用

  • JavaScript链式调用实例

    这篇文章主要介绍了JavaScript链式调用,结合实例形式分析了javascript链式调用的相关原理、实现方法...

  • js链式调用 动画

    jquery链式调用: jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可以...

  • js链式调用 动画

    jquery链式调用: jquery对象的方法会在执行完后返回这个jquery对象,所有jquery对象的方法可以...

  • swift重温笔记(可选链式调用)

    使用可选链式调用代替强制展开 为可选链式调用定义模型类 通过可选链式调用访问属性 通过可选链式调用调用方法 通过可...

  • 你一定不知道的链式调用新姿势

    如何链式调用Java静态方法? 链式调用 首先需要提一下最近几年在开发界大的链式调用,链式调用非常利于编写,更利于...

网友评论

    本文标题:js的链式调用分析

    本文链接:https://www.haomeiwen.com/subject/shiekxtx.html