前后端差异更小了——浅谈ES(ECMAScript)6

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

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

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

//继承
class parent {
    constructor(par) {
        this.Name = par;
        console.log(‘[父类的构造方法 ‘ + this.Name + ‘]‘);
    }
    sayHello() {
        console.log(‘父类的sayHello方法 Hello ‘ + this.Name);
    }
}

class child extends parent {
    constructor(name) {
        super(‘[子类调用父类的构造 ‘ + name + ‘]‘);
    }
    sayGoodBye() {
        console.log(‘子类的sayGoobBue方法 GoodBye ‘ + this.Name);
    }
}

//调用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怎么会忘记我们的对象字面量呢?继承当然也会出现在对象字面量的应用中:

var Es6Parent = {
    cons(mess) {
        console.log(‘原型Es6Parent的cons方法‘ + mess);
    }
}
var Es6Child = {
    //设置原型为 Es6Parent ,相当于继承
    __proto__: Es6Parent,
    work() {
        console.log(‘下层Es6Child的work方法 I\‘m very busy!‘);
    }
}

//调用
Es6Parent.cons(‘原型cons方法‘);
Es6Child.cons(‘下级调用上层原型的方法‘);
Es6Child.work();

运行结果如下:

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

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

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

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

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

function show(...all) {
    all.forEach(function (i, v) {
        console.log(`不定量参数的值:${v}`);
    }, all);
}

//调用show(1,2,3,4,5,6);

运行结果如下:

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

function sayHi(name, age, sex) {
    console.log(`大家好,我是${name},今年${age}岁,我是${sex}生。`);
}

//调用
var arr = [‘小明‘, 18, ‘男‘];
sayHi(...arr);

运行结果如下:

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

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

function callBack(back) {
    back();
}

//两种调用方式对比
callBack(function () {
    console.log(‘我是旧的调用方式‘);
});

callBack(()=>console.log(‘我是lambda调用方式‘));

运行结果如下:

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

var show_msg = (name, job) => {
    console.log(`大家好,我叫${name},是一名${job}`)
};

//调用
show_msg(‘暮城‘,‘软件攻城狮‘);

运行结果如下:

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

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

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

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

var par1 = ‘key_1‘;
var par2 = ‘key_2‘;
var testMap = new Map();
testMap.set(par1, ‘第一个值‘);
testMap.set(par2, ‘第二个值‘);
testMap.set(par1, ‘第三个值‘);
for(i of testMap) {
    console.log(i);
}

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

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

var par11 = ‘value_1‘;
var par22 = ‘value_2‘;
var testSet = new Set();
testSet.add(par11);
testSet.add(par22);
testSet.add(par11);
for(i of testSet) {
    console.log(i);
}

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

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

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

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

//被监听的对象
var ob = { name: ‘Max‘, like: ‘women‘ };
//触发监听时的程序
var pro = {
    set: function (cagObj, cagKey, cagValue) {
        console.log(`${cagObj[cagKey]}变为了${cagValue}`);
        cagObj[cagKey] = cagValue;
    }
}
ob = new Proxy(ob, pro);
ob.like = ‘man‘;

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

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

运行效果如下:

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

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

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

时间: 2025-01-04 22:30:23

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

ES6的新特性-让前后端差异越来越小

ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中. 潮流虽然太快,但我们不停下学习的步伐,就不会被潮流丢下的,下面来领略下ES6中新特性,一堵新生代JS的风采. 1.箭头操作符 如果你会C#或者Java,

极限工坊淘小咖浅谈:实体餐饮业的变革,线上拥抱线下,小程序的新零售

随着互联网的极速发展,人们的日常生活节奏逐渐加快,实体商家的经营的商铺营业额已经到达率了瓶颈期,一些经常关注互联网的商家早已经察觉小程序这是个新的风口,而互联网的发展,也已经让实体商家不得不做起线上+线下的营业模式. 餐饮业作为实体行业的代表,即使餐品再好吃.服务再优质,也有着非常大的局限性,客户离开店面之后,就无法持续提供优质的服务.外卖和餐饮APP的出现,虽然在很大程度上处理了这个问题,但对于绝大多数中小型餐饮店主来说,他们很难像巴奴火锅.德克士这样"地主"一样的知名度,有足够的物

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

说起通信网络,首先来看一个场景: 场景模式: 小明和小刚在闹市碰面. 小明对小刚大声喊道:"小刚,你好啊!" 小刚摇手答到:"你好,小明!" 就这段对话,从通信角度能看到多少信息勒? 1.两个人: 小刚和小明 2.代表两个人的称呼"小明""小刚" 3.由于是当面诉说,采用的传播介质是空气: 4.传播的信号是声波 5发生装置是声带.舌头.嘴巴 6.收听装置是耳朵 7.他们说的是中文,比如小明的发声"小刚",小

springboot+mybatis+vue+iviewui实现前后端分离的小Demo

后端利用springboot框架,数据持久层采用mybatis框架,前端采用vue.js并结合开源项目iviweui,实现一个简单的数据库增删改查操作和基于webscoket的聊天室功能,先看一下最终实现的效果: 1.登陆页面 2.登陆跳转 3.菜单选择跳转 项目地址: https://github.com/xxyxt/springdemo.git https://github.com/xxyxt/vueDemo.git 原文地址:https://www.cnblogs.com/xxyxt/p/

小辉浅谈括号匹配问题

括号匹配是很久以前的一个题,但是以前没有做出来 ,今天看数据结构,发现可以用栈做,比数组要简单的多,首先讲一下这个括号匹配时什么问题,其实就是一个简单的模拟题. 大致体一是这样的 [()()],就是语法判断你的括号符不符合规定  ,以前是想数组模拟一下,但是感觉有点烦,一直没有做,(这种还是不要学,)今天讲完数据结构,发现用栈很好写,吃完饭就写了一下,自己测了几个样例都过了 ,后面有做了一下优化,大致是这个意思 字有点弱,还能看清  ,大约就是这个意思 还可以作一点剪枝 就是这个字符串是奇数长度

浅谈云巴实时通信的编程模型

浅谈云巴实时通信的编程模型 中国物联网 2016-09-28 09:38 概要 有人常问,云巴实时通信系统到底提供了一种怎样的服务,与其他提供推送或 IM 服务的厂商有何本质区别.其实,从技术角度分析,云巴与其它同类厂商都是面向开发者的通信服务,宏观的编程模型都是大同小异,真正差异则聚焦于产品定位,业务模式,基础技术水平等诸多细节上.本文暂不讨论具体产品形态上的差异,着重从技术角度浅谈实时通信的编程模型. 什么是实时通信 「实时」(realtime) 一词在语义层面上隐含着对时间的约束(real

浅谈设计模式的学习(下)

时间过得真快啊,不知不觉又要周末了,借这个周末时间.把<浅谈设计模式的学习(下)>补上吧. 在<浅谈设计模式的学习(中)>中,说到了保持抽象的思维.接下来说一下第四点,做一个分享,也记录一下自己的学习历程. 4.学习设计模式,就不要把它看的太认真    设计模式是一个编程思想,它不是具体的代码套路.举个例子说明一下: 由于家传,接触到了一些中国的传统武术.当我与那些不懂传统武术的人交流的时候,他们总是认为中国的传统武术都是些套路.花架子,只是用来好看.在他们认为,两人打架,别人出拳

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

一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年angularjs和reactjs算是比较火的项目了,而我选择angularjs并不是因为它火,而是因它的模块化.双向数据绑定.注入.指令等都是非常适合架构较复杂的前端应用,而且文档是相当的全,碰到问题基本上可以在网上都找到答案.所以前端基本思路就以angularjs为主.代码模块化,通过requir

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

本文版权归 博客园 萧秦 所有,此处为技术收藏,如有再转,请于篇头明显位置标明原创作者及出处,以示尊重! 作者:萧秦 原文:http://www.cnblogs.com/xqin/p/4862849.html 一.前言 半年前左右折腾了一个前后端分离的架子,这几天才想起来翻出来分享给大家.关于前后端分离这个话题大家也谈了很久了,希望我这个实践能对大家有点点帮助,演示和源码都贴在后面. 二.技术架构 这两年angularjs和reactjs算是比较火的项目了,而我选择angularjs并不是因为它