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( ...
随机推荐
- [JavaScript] 获取昨日前天的日期
var day = new Date(); day.setDate(day.getDate()-1); console(day.pattern('yyyy-MM-dd'));//昨天的日期 day.s ...
- 第八天,scrapy的几个小技巧
一. 微博模拟登陆 1. 百度搜微博开放平台可满足爬取量不大的情况 2. 微博模拟登陆和下拉鼠标应对ajax加载 from selenium import webdriver import time ...
- ActiveMQ--HelloWorld
下载windows版本ActiveMQ,apache-activemq-5.15.3\bin\win64\activemq.bat 启动mq,ActiveMQ内置jetty,默认端口8161,默认用户 ...
- 搭建hadoop_之 创建3个虚拟机配置好网络
(创建3个虚拟机,1个作为主服务器,二个作为从节点) 一.安装虚拟机 Windwos:VMware Workstation Pro MAC:VMware Fusion 安装: ** 创建空 ...
- JVM-Java8的MetaSpace
Java 8 彻底将永久代 (PermGen) 移除出了 HotSpot JVM,将其原有的数据迁移至 Java Heap 或 Metaspace 为什么取消了永久代而用MetaSpace代替了永久代 ...
- Fiddler Web Debugger的代理功能(图文详解)
不多说,直接上干货! Fiddler的大部分功能都是在其作为本地代理的基础上实现的,如上面介绍的原理图一样,如果想实现数据包截断功能必须要设置为代理,它的代理功能设置比较简单,Fiddler版本2以后 ...
- Java的try-catch-finally
Javac语法糖之TryCatchFinally 如下引用文章:https://help.semmle.com/wiki/display/JAVA/Finally+block+may+not+comp ...
- jQuery Event.which 属性
which属性用于返回触发当前事件时按下的键盘按键或鼠标按钮. 对于键盘和鼠标事件,该属性用于确定你按下的是哪一个键盘按键或鼠标按钮. which属性对DOM原生的event.keyCode和even ...
- SVN 基本的工作循环
基本的工作循环 Subversion有许多特性.选项和华而不实的高级功能,但日常的工作中你只使用其中的一小部分,在这一节里,我们会介绍许多你在日常工作中常用的命令. 典型的工作周期是这样的: 更新你的 ...
- Content Negotiation using Spring MVC
There are two ways to generate output using Spring MVC: You can use the RESTful @ResponseBody approa ...