1.以$ 函数为例。通常返回一个HTML元素或一个元素集合。

代码如下:

  1. function $(){
  2. var elements = [];
  3. for(var i=;i<arguments.length;i++){
  4. var element = argument[i];
  5. if(typeOf element == "String") {
  6. element = document.getElementById(element);
  7. }
  8. if ( arguments.length === ) {
  9. return element;
  10. }
  11. elements.push(element);
  12. }
  13. return elements;
  14. }

但是;如果把这个函数改造为一个构造器,把那写元素作为数组保存在一个实例属性中,并让所有

定义在构造器函数的prototype属性所指对象的方法都返回泳衣调用方法的那个实例的引用,那么它

就有了进行链式调用的能力。

首先,需要把$函数改为一个工厂方法,负责支持链式调用的对象,这个函数应该能接受元素数组形式的参数,以便于我们能够使用与原来一样的公共借口。

代码如下:

  1. function(){
  2. //私有
  3. function _$(els){
  4. this.elements = [];
  5. for(var i=;i<els.length;i++) {
  6. var element = els[i];
  7. if(typeOf element === "String") {
  8. element = document.getElementById(element);
  9. }
  10. this.elements.push(element);
  11. }
  12. //共有借口 仍然一样
  13. window.$ = function() {
  14. return new _$(arguments);
  15. }
  16.  
  17. })()

由于所有对象都会继承其原型对象的属性和方法,所以我们可以让定义在原型对象中的几个方法都返回用于调用方法的实例对象的引用,这样就可以对那些方法进行链式调用---》有了这一点《-----我们就可以动手在_$这个私有构造函数的prototype对象中添加方法,用于实现链式调用;

代码如下:

  1. (function() {
  2. // 私有构造器
  3. function _$(els){
  4. this.elements = [];
  5. for(var i = ;i<els.length;i++){
  6. var element = els[i];
  7. if(typeOf element === "String") {
  8. element = document.getElementById(element);
  9. }
  10. this.elements.push(element);
  11. }
  12. // 在原型中添加属性和方法
  13. _$.prototype = {
  14. each: function(){
  15. for(var i = ;i<this.elements.length;i++){
  16. fn.call(this,this.elements[i]);
  17. }
  18. return this;
  19. },
  20. setStyle: function(prop, val) {
  21. this.each(function(el){
  22. el.style[prop] = val;
  23. });
  24. return this;
  25. },
  26. show: function() {
  27. var that = this;
  28. this.each(function(el){
  29. that.setStyle('display', 'block');
  30. });
  31. return this;
  32. },
  33. addEvent: function(type, fn){
  34. var add = function(el){
  35. if(window.addEventListener) {
  36. el.addEventListener(type, fn,false);
  37. } else if(window.attachEvent) {
  38. el.attachEvent(on + 'type', fn);
  39. }
  40. this.each(function(el){
  41. add(el);
  42. });
  43. }
  44. return this;
  45. }
  46. };
  47. window.$ = function() {
  48. return new _$(arguments);
  49. }
  50.  
  51. }
  52.  
  53. })

到目前为止,该类的每一个方法的最后一行都是以 return this 结束。 这会将用以调用方法的对象传给调用链上的下一个方法。支持链式调用的接口带来的可能性是无穷的。现在你就可以实现代码的链式调用了

  1. $(window).addEvent('load',function(){
  2. $('xxx').show().setStyle().addEvent('click',function(){
  3. //想写的代码
  4. })
  5. })

ps: 到此为止,你基本上可以理解JS 或者 Jquery是如何实现了方法的链式调用。。。

如果觉得文章不错,欢迎打赏

下一篇将介绍如何设计一个支持方法链式调用的JS 库

如何写 JS 的链式调用 ---》JS 设计模式《----方法的链式调用的更多相关文章

  1. JavaScript设计模式——方法的链式调用

    方法的链式调用: (function() { //私有类 function _$ (els) { this.elements = []; for(var i = 0, len = els.length ...

  2. 学了ES6,还不会Promise的链式调用?🧐

    前言 本文主要讲解promise的链式调用的方法及其最终方案 应用场景 假如开发有个需求是先要请求到第一个数据,然后根据第一个数据再去请求第二个数据,再根据第二个数据去请求第三个数据...一直到最后得 ...

  3. 这一次搞懂Spring代理创建及AOP链式调用过程

    文章目录 前言 正文 基本概念 代理对象的创建 小结 AOP链式调用 AOP扩展知识 一.自定义全局拦截器Interceptor 二.循环依赖三级缓存存在的必要性 三.如何在Bean创建之前提前创建代 ...

  4. 【Java】子类的链式调用

    记录最近在项目设计中遇到的一个小问题. 前提:有这样两个POJO类,它们都可以通过链式调用的方式来设置其属性值,其中一个类继承了另一个类. 问题:通过链式调用,子类对象访问父类方法后,如何使返回对象仍 ...

  5. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  6. Swift-09-可空链式调用(Optional Chaining)

    我对这个的理解就是:我们有可能会用到其他的属性或者方法,当我们在使用其他的时候,可以使用点语法去访问另一个的属性,这样的使用,就形成了链式访问. 可空链式调用是一种可以请求和调用属性.方法及下表的过程 ...

  7. swift 学习- 19 -- 可选链式调用

    // 可选链式调用 是一种在当前值可能为 nil 的可选值上请求 和 调用属性, 方法以及下标, 如果 可选值有值, 那么调用就会成功, 如果可选值是 nil, 那么就会将返回 nil , // 多个 ...

  8. js链式调用 柯里化

    var d = 1; d.add(2).add(3).add(4) //输出10 写出这个add函数 Number.prototype.add = function(x){ return this + ...

  9. [js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数

    一.我们从一个简单的构造函数+原型程序开始 var G = function(){}; G.prototype = { length : 5, size : function(){ return th ...

随机推荐

  1. typedef

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...

  2. Apache报错信息之Invalid command 'Order', perhaps misspelled or defined by a module not included in the server config

    今天配置开启Apache虚拟主机时, 然后日志报错提示: Invalid command 'Order', perhaps misspelled or defined by a module not ...

  3. java面向对象---对象容器

    泛型类--ArrayList<>; 2.对象数组中的每个元素都是对象的管理者而并非对象本身!!!!! 3.java类的基本数据类型 基本数据类型 包装类 byte Byte short S ...

  4. smarty使用

    smarty-牛刀小试 smarty 初识 官网 http://www.smarty.net/ Smarty is a template engine for PHP(PHP模板引擎) smarty使 ...

  5. codevs 2287 火车站

    2287 火车站  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 钻石 Diamond     题目描述 Description 火车从始发站(称为第1站)开出,在始发站上车的人 ...

  6. Java 抽象类与接口

    接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...

  7. C#委托

    1.什么是委托: 委托是一个类型安全的对象,它指向程序中另一个以后会被调用的方法(或多个方法).它类似C语言里的函数指针,但它是类型安全的. 委托类型包含3个重要的信息: 它所调用的方法的名称 该方法 ...

  8. 4 django系列之HTML通过form标签来同时提交表单内容与上传文件

    preface 我们知道提交表单有2种方式,一种直接通过submit页面刷新方法来提交,另一种通过ajax异步局部刷新的方法提交,上回我们说了通过ajax来提交文件到后台,现在说说通过submit来提 ...

  9. css 实现悬浮效果

    <!DOCTYPE html><html><head>  <meta charset="UTF-8">    <title&g ...

  10. adobe premiere pro cc2015.0已停止工作 解决办法

    adobe premiere pro cc2015.0已停止工作 一直报错 解决办法就是: 删除我的电脑  我的饿文档下的 Adobe下的Premiere Pro文件夹 现象就是怎么重新安装都不管用P ...