原生js实现简单的链式操作

小蚊子

高级前端工程师
在jQuery中,一个jq对象能一直连续调用各种方法,因为jQuery把这些方法挂载他自定义的一个对象中,但是使用原生的js获取的DOM对象,只能使用一次addEventLisenter方法添加事件,如果要接着添加事件,还得再调用addEventLisenter。

var area = document.querySelector('.area');area.addEventListener('mouseenter', function(){    console.log( 'mouse enter' );});area.addEventListener('click', function(){    console.log( 'click' );});

可是如果我想在area绑定mouseenter事件后,接着绑定click事件呢。我们也可以参考下jQuery的实现思路,但是没jQuery这么完善。

;(function(){    window.G = function(selector){        return new _G(selector);    }    function _G(selector){        this.elements = document.querySelector(selector);        return this;    }    _G.prototype = {        constructor : _G,        method : function(name, fn){            if(this.elements){                this.elements.addEventListener(name, fn, false);            }            return this;        }    }})();

这样我们就能实现一个简单的链式调用了,给.area同时绑定两个事件:

G('.area').method('mouseenter', function(){    console.log( 'mouse enter' );}).method('click', function(){    console.log( 'click' );})

实现原理相信大家看到代码也非常的清楚:

  1. 输出一下G('.area'),他返回的就是一个_G的实例对象;
  2. 在_G的内部,把DOM对象存储在elements上,然后prototype上实现了method方法,就是给elements添加对应的事件,每次调用后,都把this返回,供下次使用;
  3. G('.area')就能使用使用method方法来添加事件了,同时每次method都会把this返回,这样就能连续添加事件
    上面的代码我们只是实现了如何为DOM对象连续添加事件,当然我们还可以在_G.prototype中添加别的方法,不过别忘记了return this:
_G.prototype = {    constructor : _G,    method : function(name, fn){        if(this.elements){            this.elements.addEventListener(name, fn, false);        }        return this;    },    show : function(){        this.elements.style.display='';        return this;    },    hide : function(){        this.elements.style.display='none';        return this;    }}

这样G()就能使用show()和hide()了:

// 隐藏G('.area').hide();// 显示并且绑定click事件G('.area').show().method('click', function(){    console.log( Date.now() );})

注意: G('.area')不是原生的DOM对象,不能直接操作DOM对象上的属性与方法,比如我想隐藏.area:

G('.area').style.display='none'; // 错误

是不能这么操作的。DOM对象存储在elements中,如果想直接在DOM对象上操作,可以:

G('.area').elements.style.display='none'; // 正确

总结一下,这里我们也只是用原生js简单的实现了下链式操作,更复杂的功能,比如对象缓存,异常处理等等,都需要后续再完善处理。

文章内容由蚊子(师少兵)的前端博客进行发布,或许你想直接查看原文: https://www.xiabingbao.com/js/2017/06/19/js-chain-operation.html

或者直接查看他的前端博客: 蚊子的前端博客

©著作权归作者所有:来自51CTO博客作者mb5fd86853067b7的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 使用原生 js 实现选项卡、一键更换背景图片、图片懒加载和轮播图
  2. JAVA垃圾回收机制
  3. js 中数组常用方法介绍以及 JSON 对象的两个方法展示和跨域请求
  4. 常用的字符串方法介绍以及使用事件代理实现一个简单的留言板
  5. jQuery 浅析
  6. 面向对象封装,继承,加载器
  7. 面向对象编程基础
  8. 0202面向对象编程基础
  9. PHP面向对象编程

随机推荐

  1. 共享文件夹
  2. 华为ensp链路聚合综合实验
  3. Kafka 原理以及分区分配策略剖析
  4. 单臂路由
  5. 说话时如何把“NO”变成“yes”?
  6. Azure DevTest Lab体验(二)用户测试
  7. 链路追踪 SkyWalking 源码分析 —— Coll
  8. 链路追踪 SkyWalking 源码分析 —— Coll
  9. 分布式作业系统 Elastic-Job-Cloud 源码
  10. 一文学会Vue中间件管道[每日前端夜话0x8C