美文网首页
js链式写法

js链式写法

作者: thekings | 来源:发表于2018-08-15 10:05 被阅读0次

    前言:前不久阿里远程面试时问了我一个问题,如下:

    function Person(){};varperson  =new Person();//实现person.set(10).get()返回20

    当时正在问我原型链的问题,所以面试官直接用我写的person问的,我当时是这么实现的:

    function Person(){};

    var person  =new Person();

    person.set =function(n){

      return {

        get:function(){

          returnn*2;

      }}

    }

    返回结果其实也对,但set()和get()耦合太紧,不灵活。再联想一下当时正在考我原型链,且面试开始时问了我jQuery的链式操作原理(没答上来),所以感觉这题应该跟链式操作有关,于是上网查了查,确实是要用链式操作。先来看看链式操作的原理和js如何实现。

    js实现链式操作

    jQuery有一个十分强大的特点:链式操作。其实原理很简单,就是每次方法执行完后返回this对象,这样后面的方法就可以继续在this环境下执行。先来实现一下:

    //创建一个类function Person(){};

    //在原型上定义相关方法

    Person.prototype ={

      setName:function(){

        this.name = name;

        returnthis;

      },

      setAge:function(){

        this.age = age;

        returnthis;

      }

    }

    //实例化varperson=new Person();

    person.setName("Mary").setAge(20);

    以上过程就实现了链式操作,而原理只是在每个方法调用后返回了this。jQuery中不用new一个实例化对象,所以可以将实例化过程封装如下:

    //将实例化过程封装为一个函数

    function newObj(){

      returnnew Person();

    }

    newObj().setName("Mary").setAge(20);

    此时再想想上面的那道题,就很简单了:

    function Person(){};

    //实现部分Person.prototype ={

      set:function(value){

        this.value = value;

        returnthis;

      },

      get:function(){

        returnthis.value*2;//由于要返回值,且不需要继续调用方法,所以不返回this

    }

    }

    var person =new Person();

    console.log(person.set(10).get());//20

    链式操作的优缺点

    首先来说说缺点。

    根据上面阿里面试题的实现,我们可以看出,get方法里不能返回this,因为有值需要返回。这就是链式操作的一个局限:只能应用在不需要返回值的情况下,或者只能最后一步需要返回值。jQuery主要是对DOM元素的操作,只需要改变DOM元素的表现而不需要返回值,所以适合链式操作。

    再来说说优点。

    js的执行环境为单线程,为了避免阻塞,我们时常用一些异步编程方式来完成一些可能产生阻塞的操作。常见的异步编程方式包括回调函数、事件监听、ES6中的Promise对象。

    链式操作实际上就是使得异步编程的流程更加清晰,不会像回调函数一样相互耦合,难以分辨函数的执行顺序且维护困难。ES6中的Promise也正是沿用了这一思想,每一个异步任务返回一个Promise对象,通过then方法指定回调函数。

    相关文章

      网友评论

          本文标题:js链式写法

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