2015年6月,ES6正式发布。至今一年多的时间内,各个浏览器也对支持ES6做出了很大的改善,所以同学们无需顾忌你写代码的浏览器不认识~

这么久的东西一定早有大神剖析过,今天我们以一个后端菜鸟的视角重新解读下ES6加入的新语法。

首先很开心,ES6对class(类)的支持上升到了一个新高度,允许构造和继承,新语法看上来是这样的:

  1. //继承
  2. class parent {
  3. constructor(par) {
  4. this.Name = par;
  5. console.log('[父类的构造方法 ' + this.Name + ']');
  6. }
  7. sayHello() {
  8. console.log('父类的sayHello方法 Hello ' + this.Name);
  9. }
  10. }
  11.  
  12. class child extends parent {
  13. constructor(name) {
  14. super('[子类调用父类的构造 ' + name + ']');
  15. }
  16. sayGoodBye() {
  17. console.log('子类的sayGoobBue方法 GoodBye ' + this.Name);
  18. }
  19. }
  20.  
  21. //调用
    var a = new parent('Es6');
    a.sayHello();
    var b = new child('Max');
    b.sayHello();
    b.sayGoodByr();

有没有被惊艳到?(可这的确是个Js文件),运行后的效果是这样的:

和后端一样,子类继承父类需要使用关键字extends,继承后,可以使用关键字super调用父类属性。

并且我发现此处的this在被继承后也被子类一并带入,也就是说:this的作用域将会被向下传递。(请参照运行结果最后一行。)

上面是class(类)的继承,有了继承,我们在构建Js代码时,就会获得更强大的能力(可扩展、易维护、易阅读等)。

可能有些同学会说了:我根本不习惯这样写,感觉都不像Js了啊喂!

没关系,ES6怎么会忘记我们的对象字面量呢?继承当然也会出现在对象字面量的应用中:

  1. var Es6Parent = {
  2. cons(mess) {
  3. console.log('原型Es6Parent的cons方法' + mess);
  4. }
  5. }
  6. var Es6Child = {
  7. //设置原型为 Es6Parent ,相当于继承
  8. __proto__: Es6Parent,
  9. work() {
  10. console.log('下层Es6Child的work方法 I\'m very busy!');
  11. }
  12. }
  13.  
  14. //调用
  1. Es6Parent.cons('原型cons方法');
  1. Es6Child.cons('下级调用上层原型的方法');
  1. Es6Child.work();

运行结果如下:

设置的方式也超简单:使用关键字'__proto__'设置原型即可(只不过是给原型链换了种叫法而已嘛)

下面介绍一些简单实用的语法糖,首先是方便的参数设置:

  1. var Name = 'Max';
  2. console.log(`我是很方便带参数的的波浪符${Name}`);

重点是${},它可以直接在字符串中带入参数(拼接方便很多有木有),但是需要和波浪符(`)搭配使用才有效哦~

接下来是...语法,当它出现在形参列表内,代表不定量参数:

  1. function show(...all) {
  2. all.forEach(function (i, v) {
  3. console.log(`不定量参数的值:${v}`);
  4. }, all);
  5. }
  6.  
  7. //调用
    show(1,2,3,4,5,6);

运行结果如下:

定义的时候是不是省力很多呢?还有更好用的,当...出现在实参列表内,它将允许直接传入数组(而不是使用apply):

  1. function sayHi(name, age, sex) {
  2. console.log(`大家好,我是${name},今年${age}岁,我是${sex}生。`);
  3. }
  4.  
  5. //调用
  6. var arr = ['小明', 18, '男'];
  7. sayHi(...arr);

运行结果如下:

定义sayHi函数时,写了3个参数,调用时使用...传入数组时,它将从0下标开始依次顺序匹配参数。

我们在工作中,经常使用回调函数来完成某些操作,但是每次回调都要写个完整的funciton(好麻烦的说),ES6引入了lambda表达式,大大优化了这一操作:

  1. function callBack(back) {
  2. back();
  3. }
  4.  
  5. //两种调用方式对比
  6. callBack(function () {
  7. console.log('我是旧的调用方式');
  8. });
  9.  
  10. callBack(()=>console.log('我是lambda调用方式'));

运行结果如下:

使用了lambda以后的函数传入方式是不是更优雅呢?如果比较萌比,那就再来一个对象字面量版本的:

  1. var show_msg = (name, job) => {
  2. console.log(`大家好,我叫${name},是一名${job}`)
  3. };
  4.  
  5. //调用
  6. show_msg('暮城','软件攻城狮');

运行结果如下:

现在大家应该已经很清楚了:()=>语法呢,=>前面是参数列表,后面是方法体。以后看到类似的语法可别晕~

语法糖还有很多,我先说这么多,因为下面要说更重要的:新数据类型和监听的实现。

Es6新增了map,set,以及weakMap、weakSet四种类型。

它们都有什么差异呢?先说说map:map以key-value的方式存储,并且在map内所有的键都是唯一的,来看被for in 遍历后的结果:

  1. var par1 = 'key_1';
  2. var par2 = 'key_2';
  3. var testMap = new Map();
  4. testMap.set(par1, '第一个值');
  5. testMap.set(par2, '第二个值');
  6. testMap.set(par1, '第三个值');
  7. for(i of testMap) {
  8. console.log(i);
  9. }

可以看到第三个值将第一个值顶替掉而不是共存,原因就是第一个值和第三个值键相同。

set和map的差别就在于,它是以value的方式存储,而且同样不允许重复值出现:

  1. var par11 = 'value_1';
  2. var par22 = 'value_2';
  3. var testSet = new Set();
  4. testSet.add(par11);
  5. testSet.add(par22);
  6. testSet.add(par11);
  7. for(i of testSet) {
  8. console.log(i);
  9. }

至于WeakMap和WeakSet,使用方式都一样,只是这两种类型的键都采用了弱引用,即:作为属性键的对象如果没有其他地方引用时自动回收(自动释放)。

此处就不多做解释,不过我推荐大家使用WeakMap和WeakSet。

现在,我们终于说到了监听器(监听器可是重头戏)

监听器是很有意思的东西,它给予了我们极大的便利,这一点在实现MVVM模型的操作时尤为重要,ES6中的监听看上去大概是这样的:

  1. //被监听的对象
  2. var ob = { name: 'Max', like: 'women' };
  3. //触发监听时的程序
  4. var pro = {
  5. set: function (cagObj, cagKey, cagValue) {
  6. console.log(`${cagObj[cagKey]}变为了${cagValue}`);
  7. cagObj[cagKey] = cagValue;
  8. }
  9. }
  10. ob = new Proxy(ob, pro);
  11. ob.like = 'man';

set内定义的function将会在监听对象发生改变时自动触发,参数列表内的3个值也是默认定义的,它们依次是:被修改的对象、该对象的键、该对象的值。

需要注意的是如果你为某元素设定的监听器触发后,它原本的修改进程会被阻止(如果你不进行这一步的话),所以需要我们显式的去修改才可。

运行效果如下:

拥有了这些特性,我们自己想写一个类似于VUE的数据框架也变得简单了许多。

另外,ES6还更新了很多命名空间下的函数(如:math),这里就不一一罗列(写不完并且网上大把)。

最后,ES6的推出让我直观感觉到前后端差距进一步缩小,希望有一天Js可以不借助后端完成数据交互~(不要吐槽我学的晚)

前后端差异更小了——浅谈ES(ECMAScript)6的更多相关文章

  1. 小E浅谈丨区块链治理真的是一个设计问题吗?

    在2018年6月28日Zcon0论坛上,“区块链治理”这个话题掀起了大神们对未来区块链治理和区块链发展的一系列的畅想. (从左至右,分别为:Valkenburgh,Zooko,Jill, Vitali ...

  2. 小dai浅谈通信网络(一)——引子

    说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这么几句简单的话 ...

  3. express+vue-cli实现前后端分离交互小例

    准备工作 1.Express 应用生成器 npm install express-generator -g 2.vue-cli手脚架 npm install -g vue-cli 3.项目结构 . ├ ...

  4. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

  5. 【开源】分享一个前后端分离方案-前端angularjs+requirejs+dhtmlx 后端asp.net webapi

    一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年a ...

  6. 关于前后端同构,我的一点思路和心得(vue、nodejs、react、模版、amd)

    最近1年多,前后端同构慢慢变成一个流行词,也许很多人还停留在前后端分离的最佳实践道路上,但实际上又有一批人已经从简单的服务端渲染走向探索最佳前后端同构方案的路上了.不过,我只是膜拜后者的过客. 虽然大 ...

  7. 浅谈通信网络(三)——TCP/IP协议

    简介 Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议.In ...

  8. 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十四 ║ VUE 计划书 & 我的前后端开发简史

    ---新内容开始--- 番外 大家周一好呀,又是元气满满的一个周一呀!感谢大家在周一这个着急改Bug的黄金时期,抽出时间来看我的博文哈哈哈,时间真快,已经到第十四篇博文了,也很顺顺(跌跌)利利 (撞撞 ...

  9. [开源] angularjs + Asp.net 前后端分离解决方案

    本文版权归 博客园 萧秦 所有,此处为技术收藏,如有再转,请于篇头明显位置标明原创作者及出处,以示尊重! 作者:萧秦 原文:http://www.cnblogs.com/xqin/p/4862849. ...

随机推荐

  1. C#泛型比较大小

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 从源码角度深入理解Toast

    Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这 ...

  3. iOS自定义UICollectionViewLayout之瀑布流

    目标效果 因为系统给我们提供的 UICollectionViewFlowLayout 布局类不能实现瀑布流的效果,如果我们想实现 瀑布流 的效果,需要自定义一个 UICollectionViewLay ...

  4. 转:ORACLE制造方法的比较

    转自:http://blog.itpub.net/133041/viewspace-438549/ 1.离散制造. 2.重复制造 3.流式制造 Oracle Applications 支持离散.项目. ...

  5. struts2拦截器的实现原理

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  6. 3d max地形建造

    这里来记录一下max里面建造一个地形. 1.创建一个平面,调节平面的属性,包括长宽,和分段 2.然后建造一个道路 然后选择样条线工具,调节线条的轮廓. 3.使用合并工具,将线条和地面进行合并成为一个物 ...

  7. 解决Android Studio启动速度慢的问题。避免每次启动Android Studio都要fetching Android sdk compoment information。

    Android Studio每次启动都要去fetching sdk,由于Android sdk 官网在大陆连不上,所以每次启动时界面都会停在那里很久. 解决办法就是设置取消每次fetching sdk ...

  8. (六)Hibernate 映射类型

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 第一节:基本类型映射 例子: hibernate.cfg.xml < ...

  9. phaser源码解析(一) Phaser.Utils类下shuffle方法

    /** * #一个 基于 费雪耶茨排列 洗牌方法 * A standard Fisher-Yates Array shuffle implementation. * @method Phaser.Ut ...

  10. jsonp调用webapi和mvc

    webapi代码如下: public string Get(int id) { var callback = HttpContext.Current.Request["callback&qu ...