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

代码如下:

function $(){
var elements = [];
for(var i=;i<arguments.length;i++){
var element = argument[i];
if(typeOf element == "String") {
element = document.getElementById(element);
}
if ( arguments.length === ) {
return element;
}
elements.push(element);
}
return elements;
}

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

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

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

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

代码如下:

(function(){
//私有
function _$(els){
this.elements = [];
for(var i=;i<els.length;i++) {
var element = els[i];
if(typeOf element === "String") {
element = document.getElementById(element);
}
this.elements.push(element);
}
//共有借口 仍然一样
window.$ = function() {
return new _$(arguments);
} })()

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

代码如下:

(function() {
// 私有构造器
function _$(els){
this.elements = [];
for(var i = ;i<els.length;i++){
var element = els[i];
if(typeOf element === "String") {
element = document.getElementById(element);
}
this.elements.push(element);
}
// 在原型中添加属性和方法
_$.prototype = {
each: function(){
for(var i = ;i<this.elements.length;i++){
fn.call(this,this.elements[i]);
}
return this;
},
setStyle: function(prop, val) {
this.each(function(el){
el.style[prop] = val;
});
return this;
},
show: function() {
var that = this;
this.each(function(el){
that.setStyle('display', 'block');
});
return this;
},
addEvent: function(type, fn){
var add = function(el){
if(window.addEventListener) {
el.addEventListener(type, fn,false);
} else if(window.attachEvent) {
el.attachEvent(on + 'type', fn);
}
this.each(function(el){
add(el);
});
}
return this;
}
};
window.$ = function() {
return new _$(arguments);
} } })

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

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

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. Tween公式 以及四个参数

    Tween的主页在这里:http://createjs.com/tweenjs , 这里边还有挺多开源项目的: Tween公式 4个参数 t:current time(当前时间) b:beginnin ...

  2. Beta版本冲刺第五天

    Aruba 408 409 410 428 429 431 完成任务: 数据库对于分类新建/删除的更新 调整图片再编辑界面的合适大小 调整常驻通知栏按钮的跳转逻辑 微调数据库 立会照片: 燃尽图: c ...

  3. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  4. Day6-python基础之模块

    模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才 ...

  5. 获取URL中的参数

    function GetQueryString(name){ var reg = new RegExp("(^|&)"+ name +"=([^&]*)( ...

  6. ios官方菜单项目重点剖析附项目源码

    原版教程:https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift ...

  7. 【转】真正从零开始,TensorFlow详细安装入门图文教程!(帮你完成那个最难的从0到1)

    AI这个概念好像突然就火起来了,年初大比分战胜李世石的AlphaGo成功的吸引了大量的关注,但其实看看你的手机上的语音助手,相机上的人脸识别,今日头条上帮你自动筛选出来的新闻,还有各大音乐软件的歌曲& ...

  8. MyBatis Cache配置

    @(MyBatis)[Cache] MyBatis Cache配置 MyBatis提供了一级缓存和二级缓存 配置 全局配置 配置 说明 默认值 可选值 cacheEnabled 全局缓存的开关 tru ...

  9. Java特性之多态父类与子类之间的调用

    问题描述: Java三大特性,封装.继承.多态,一直没搞懂其中多态是什么,最近研究了一下,关于父类和子类之间的调用.下面是一个测试类,源代码如下: package com.test; public c ...

  10. runtime-对成员变量操作应用之归档和返归档

    为了实现归档和返归档,我们要让被归档对象的类接受NSCoding协议并且实现协议里的两个方法 - (void)encodeWithCoder:(NSCoder *)aCoder; - (nullabl ...