• 简洁属性与简洁方法
  • 计算属性名与[[prototype]]
  • super对象(暂时保留解析)
  • 模板字面量(模板字符串)

一、简洁属性与简洁方法

ES6中为了不断优化代码,减低代码的耦合度在语法上下了很大的功夫,上一篇博客解构就是其中一种,在对象属性和方法名称上也有所优化,也就是这篇博客要解析的简洁属性和简洁方法。

什么是简洁属性呢?当通过字面量的方式声明对象时,属性名与赋值的变量名一致时,就可以采用简洁属性,示例:

 //ES6的对象字面量简洁属性
var x = 2, y = 3,
obj = {
x,
y
};
//ES5的编译结果
var x = 2,
y = 3,
obj = {
x: x,
y: y
};

什么是简洁方法呢?当采用对象字面量的方式声明对象,可以省略方法的function字符,示例:

 //ES6的对象字面量简洁方法
var obj = {
foo(){
//...
},
fun(){
//...
}
}
//ES5的编译结果
var obj = {
foo: function foo() {//...
},
fun: function fun() {//...
}
};

但是简洁方法需要注意,如果在对象方法中出现需要实现递归算法的话,就不能使用简洁方法的语法,比如下面这个代码(ES5的代码)就不能转换成简洁方法的写法:

 function ruSomething(o){
var x = Math.random(),
y = Math.random();
return o.something(x, y);
} ruSomething({
something:function something( x , y){
if(x > y){
return something(y , x); //这里递归了,请勿使用简洁语法
}
return y - x;
}
});

为什么不能呢?接着来看简洁语法的写法:

 //ES6简洁语法编写上一个示例代码(错误代码,请勿使用)
ruSomething({
something( x , y){
if(x > y){
return something(y , x);
}
return y - x;
}
});
//ES5的编译结果
ruSomething({
something: function (_something) {
function something(_x, _x2) {
return _something.apply(this, arguments);
} something.toString = function () {
return _something.toString();
}; return something;
}(function (x, y) {
if (x > y) {
return something(y, x);
} return y - x;
})
});

因为something(y,x)递归是找不到这个方法的引用,在编译的时候就会认为简洁写法小括号前面是方法执行,后面是一个作用域块,编译时会认为有一个function something(x,y){...}在作用域上,最后导出的ES5的编译结果就是这个奇怪的代码了。

这时候可能会有人认为给something(y,x)递归加上一个this指向,就可以解决了,来看看这种猜想是否成立:

 //ES6中对象方法递归使用this实现
ruSomething({
something( x , y){
if(x > y){
return this.something(y , x);
}
return y - x;
}
});
//ES5的编译结果
ruSomething({
something: function something(x, y) {
if (x > y) {
return this.something(y, x);
} return y - x;
}
});

看着上面的代码好像编译正确了,没有什么问题,但是这种写法有一个缺陷,来看下面这个模拟代码:

 var controller = {
makeRequest(..){
//..
this.makeRequest(..);
}
}
bun.addEventListener("click",controller.makeRequest,false);

这点代码模拟的是对象方法是被事件触发的,你想想它的this指向了谁?这不用我多说了吧。所以在对象方法需要被执行递归计算的时候最好采用ES5的语法。

二、计算属性名

计算属性名起始在ES5中就已经有存在,只是相对ES6的计算属性名来说还是没有达到最简便的方式。计算属性名其实就是使用表达式计算获取对象属性名,先来回忆ES5的计算属性名:

 //ES5的计算属性名
var prefix = "user_";
var o = {
baz:function(){}
}
o[prefix + "foo"] = function(){};
o[prefix + "bar"] = function(){};

ES5中使用计算属性名不能直接写在对象字面量上,而是需要另外采用对象键的方式来实现,而ES6可以直接写在对象字面量上:

 var prefix = "user_";
var obj = {
baz:function(){},
[prefix + "foo"] : function(){},
[prefix + "bar"] : function(){}
}

在对象属性字面这部分,顺便说明一下,ES6标准了[[prototype]]的可以直接使用点的方法添加对象原型属性,但是这个标准化存在着很大的争议,都是这个标准化是为了兼容之前的js代码不得不标准话的语法。

 var a = {...}
var obj = {
__proto__:a,
...
}

三、模板字面量

模板字面量有通常被称为模板字符串,也有人说是增强版的字符串,用反引号(`)标识。模板字符串可以当作普通的字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

 //ES6模板字面量语法
// 普通字符串
console.log(`In JavaScript \n is a line-feed.`); //可以使用\n来实现换行
// 多行字符串,模板可以自动实现换行
console.log(
`In JavaScript this is
not legal`);
//字符串中嵌入变量
var name = "Bob", time = "today";
console.log(`Hello ${name}, how are you ${time}`); //ES5编译结果
console.log("In JavaScript \n is a line-feed.");
console.log("In JavaScript this is\nnot legal");
var name = "Bob",
time = "today";
console.log("Hello ".concat(name, ", how are you ").concat(time));

在模板中可以使用${...}嵌入语法,这样就可以使用模板复用了,因为如果是纯字符的化只能采用字符串拼接“+“,这种写法获取到的是字符串的拼接后的值,而不是拼接表达式,有了模板字面量和${..}嵌入语法就可以实现字符串模板复用。

 //ES6插入(嵌入)表达式可以嵌套,并且也可以使用模板
function upper(s){
return s.toUpperCase();
}
var who = "reader";
var text =
`A rey ${upper("warm")} welcome
to all of you ${upper(`${who}s`)}!`;
console.log(text);
//ES5的编译结果:
function upper(s) {
return s.toUpperCase();
} var who = "reader";
var text = "A rey ".concat(upper("warm"), " welcome\nto all of you ").concat(upper("".concat(who, "s")), "!");
console.log(text);

关于标签模板字面量作为方法参数使用时,会像字符串字符串一样吗?千万别用模板字面量替代方法的参数,因为使用模板字面量作为方法的实参是一个独立的语法,通常被称为标签模板字面量,来看示例:

 function foo(strings, ...values){
console.log(strings),
console.log(values)
} function bar(){
return function foo(strings, ...values){
console.log(strings),
console.log(values)
}
}
var desc = "awesome";
foo `Everything is ${desc}!`;
bar()`Everything is ${desc}!`;
//上面两种执行结果一致
//["Everything is ", "!"]
//["awesome"]

在标签模板字面量语法中,第一个形参收集的是模板中被嵌入表达式${...}分割的字符串数组,第二个形参要使用“...”语法收集嵌入表达式获取的数据集。关于更多可以了解《你不知道的js》下卷P100~P103

ES6入门四:对象字面量扩展与字符串模板字面量的更多相关文章

  1. ES6入门之对象扩展

    ES5对象(超类)原有: 属性:construct构造函数 方法: object.hasOwnProperty( propertyName ) //检测是否有一个本地的属性而不是继承的,返回boole ...

  2. ES6入门系列 ----- 对象的遍历

    工作中遍历对象是家常便饭了,遍历数组的方法五花八门, 然而很多小伙伴是不是和我之前一样只会用for ...in.... 来遍历对象呢, 今天给大家介绍五种遍历对象属性的方法: 1, 最常用的for  ...

  3. ES6里关于模板字面量的拓展

    JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出JS已有的字符串体系 ...

  4. es6 快速入门 系列 —— 对象

    其他章节请看: es6 快速入门 系列 对象 试图解决的问题 写法繁杂 属性初始值需要重复写 function createPeople(name, age){ // name 和 age 都写了 2 ...

  5. ES6模板字面量

    前面的话 JS 的字符串相对其他语言来说功能总是有限的,事实上,ES5中一直缺乏许多特性,如多行字符串.字符串格式化.HTML转义等.ES6通过模板字面量的方式进行了填补,模板字面量试着跳出自己JS已 ...

  6. ES6躬行记(4)——模板字面量

    模板字面量(Template Literal)是一种能够嵌入表达式的格式化字符串,有别于普通字符串,它使用反引号(`)包裹字符序列,而不是双引号或单引号.模板字面量包含特定形式的占位符(${expre ...

  7. ES6入门——数值的扩展

    1.二进制和八进制表示法 ES6提供了二进制和八进制数值的新的写法,分别用前缀0b或0B和0o或0O表示. 2.Number.isFinite(),Number.isNaN() ES6在Number对 ...

  8. ES6学习笔记(四)数值的扩展

    1.二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...

  9. ES6 入门系列 - 函数的扩展

    1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log( ...

随机推荐

  1. 数据库 | Oracle数据库查表空间使用情况

    平时在使用Oracle的时候,如果业务中的数据量激增.数据量变大,很有可能就会有表空间不足的情况,需要重点关注.今天我们分享下如何查看表空间的使用情况. 一.如何查看使用状况 我们废话不说,先直接贴上 ...

  2. 1.ibatis核心类

  3. String类的常用方法以及知识点总结

    一,String的简介: 查阅API中的String类的描述,发现String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 一旦这个 ...

  4. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-3.在线教育站点需求分析和架构设计

    笔记 3.在线教育站点需求分析和架构设计     简介:分析要开发的功能点和系统架构应该怎样架构 1.开发的功能:                     首页视频列表                ...

  5. Qt编写自定义控件16-魔法老鼠

    前言 五一期间一直忙着大屏电子看板软件的开发,没有再去整理控件,今天已经将大屏电子看板的所有子窗口都实现了任意停靠和双击独立再次双击最大化等功能,过阵子有空再写一篇文章介绍其中的技术点.魔法老鼠控件, ...

  6. Hive的内部表和外部表

  7. k8s中ipvs和iptables选择

    k8s 1.11.0在 centos7上不行 1.11.1之后就可以了

  8. JavaScript基本入门02

    目录 JavaScript基础入门 02 条件语句 if 语句 if .. else 语句 switch 结构 循环语句 while 循环 continue 关键字 do...while语句 for ...

  9. js有序数组中插入一个元素,并有序的输出

    题目:比较传入函数的参数,将参数组成数组,从小到大排序,返回新的数组. 如: insert();console.log(arr); //[] insert(-1,-2); console.log(ar ...

  10. sqarkSQL hiveSql

    查看数据库 show databases; 进入数据库 use 库名 查看表 show tables: select * from 表名 hdfs传输spark sql查询 hive找到指定路径sql ...