js实现链式操作
前言:前不久阿里远程面试时问了我一个问题,如下:
function Person(){};
var person = new Person();
//实现person.set(10).get()返回20
当时正在问我原型链的问题,所以面试官直接用我写的person问的,我当时是这么实现的:
function Person(){};
var person = new Person();
person.set = function(n){
return {
get:function(){
return n*2;
}}
}
返回结果其实也对,但set()和get()耦合太紧,不灵活。再联想一下当时正在考我原型链,且面试开始时问了我jQuery的链式操作原理(没答上来),所以感觉这题应该跟链式操作有关,于是上网查了查,确实是要用链式操作。先来看看链式操作的原理和js如何实现。
js实现链式操作
jQuery有一个十分强大的特点:链式操作。其实原理很简单,就是每次方法执行完后返回this对象,这样后面的方法就可以继续在this环境下执行。先来实现一下:
//创建一个类
function Person(){};
//在原型上定义相关方法
Person.prototype ={
setName:function(){
this.name = name;
return this;
},
setAge:function(){
this.age = age;
return this;
}
}
//实例化
var person= new Person();
person.setName("Mary").setAge(20);
以上过程就实现了链式操作,而原理只是在每个方法调用后返回了this。jQuery中不用new一个实例化对象,所以可以将实例化过程封装如下:
//将实例化过程封装为一个函数
function newObj(){
return new Person();
}
newObj().setName("Mary").setAge(20);
此时再想想上面的那道题,就很简单了:
function Person(){};
//实现部分
Person.prototype ={
set:function(value){
this.value = value;
return this;
},
get:function(){
return this.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实现链式操作的更多相关文章
- PHP中的__toString方法(实现JS里的链式操作)
_toString方法是在打印对象时自动调用的魔术方法,如果不声明会报以下错 Catchable fatal error: Object of class String could not be co ...
- js实现一个简单的链式操作
如何实现一个链式操作 function person() {} person.prototype = { setname: function(name) { this.name = name retu ...
- jQuery链式操作[转]
用过jQuery的朋友都知道他强大的链式操作,方便,简洁,易于理解,如下 $("has_children").click(function(){ $(this).addClass( ...
- 如何一行jquery代码写出tab标签页(链式操作)
啦啦!今天又学了一招,js写几十行的tab标签页jquery写一行就行啦,用到了链式操作!以下是代码: <!DOCTYPE html> <html lang="en&quo ...
- jQuery链式操作
讨论jQuery的文章很多.然而,关于jQuery的链式操作的文章并无多少.好的代码会带来速度的提升.快速渲染和响应意味着更好的用户体验. 下面就来讲讲jQuery的链式操作. 很多时候我们写代码的时 ...
- jQery的链式操作和商城简易导航栏
今天要记录的是jq的一些简单操作.项目的需求是做一个导航栏,单机不同的商品名称链接,显示相应的内容.用js来写的话相对代码量要多一些,选择jqrey一行则可以搞定,下面呢是我的代码和效果图 这个是初始 ...
- Javascript 链式操作以及流程控制
春节过后,感觉过年吃的油腻的食品转化的脂肪都长到 脑子去了. 根本转不动啊 上班第一天 实在是写不动代码了, 顺手打开多天为看的 收件箱,查看查看邮件,看看春节期间 风云变幻的前端圈又有哪些大事发生. ...
- PHP实现链式操作的三种方法详解
这篇文章主要介绍了PHP实现链式操作的三种方法,结合实例形式分析了php链式操作的相关实现技巧与使用注意事项,需要的朋友可以参考下 本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具 ...
- 用php实现一个简单的链式操作
最近在读<php核心技术与最佳实践>这本书,书中第一章提到用__call()方法可以实现一个简单的字符串链式操作,比如,下面这个过滤字符串然后再求长度的操作,一般要这么写: strlen( ...
随机推荐
- Manjaro Linux执行某些命令缺少libtinfo.so.5问题
Manjaro默认有libtinfo.so.6而没有libtinfo.so.5,软件如果需要可执行以下命令安装: sudo pacman -S ncurses5-compat-libs #或 sudo ...
- Java之IO(五)文件系统
转载请注明源出处:http://www.cnblogs.com/lighten/p/6992043.html 1.前言 在讲解Java的文件流之前,先来认识一下Java的文件系统的实现.值得一提的是, ...
- Spring Security构建Rest服务-0800-Spring Security图片验证码
验证码逻辑 以前在项目中也做过验证码,生成验证码的代码网上有很多,也有一些第三方的jar包也可以生成漂亮的验证码.验证码逻辑很简单,就是在登录页放一个image标签,src指向一个controller ...
- DotNetOpenAuth 使用指南
这几天一直在研究DotNetOpenAuth,源码处处是坑啊!写此文只为大家更顺利掌握DotNetOpenAuth使用方法,尽量少走弯路. 说明一下:我的环境是Win7 64 VS2015 upd ...
- 【数组】Majority Element II
题目: Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The alg ...
- 关于Oracle中的字符的比较
1.Oracle比较字符串是根据ASCII码来的,第一个字母的ASCII大小比较如果相等再比较下一个: 函数来说明: CREATE OR REPLACE FUNCTION MinOrMax(para1 ...
- Word2vec 理解
1.有DNN做的word2vec,取隐藏层到softmax层的权重为词向量,softmax层的叶子节点数为词汇表大小 2-3的最开始的词向量是随机初始化的 2.哈夫曼树:左边走 sigmoid(当前节 ...
- lintcode-->哈希函数
在数据结构中,哈希函数是用来将一个字符串(或任何其他类型)转化为小于哈希表大小且大于等于零的整数.一个好的哈希函数可以尽可能少地产生冲突.一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基 ...
- java的逻辑与和短路与
逻辑与 --& 短路与 -- && 只说一个最大的区别,平时我们用的最多的是 短路与来进行逻辑判断: 短路与(或)会从左往右逐个判断式子,只要能得出结果后面的式子不再判断.逻辑 ...
- 通过六个题目彻底掌握String笔试面试题
http://blog.csdn.net/chj97/article/details/6899598 1 public static void main(String[] args) { String ...