• 简洁属性与简洁方法
  • 计算属性名与[[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. 前端知识点回顾——HTML,CSS篇

    前端知识点回顾篇--是我当初刚转行为了面试而将自己学过的前端知识整理成的一份笔记,个人目的性很强,仅供参考. doctype 有什么用 doctype是一种标准通用标记语言的文档类型声明,目的是告诉标 ...

  2. 侧方、s弯道、坡起相关

    侧方: 方向盘上端对准路中箭头直行,当前面箭头头部尖角刚刚消失,停车,挂倒档,倒,当箭头尾部快要消失时右打死,侧身看左后视镜(这时可以稍微踩一下离合控制速度为低速),当出现库底角回正,坐直,当左侧第一 ...

  3. nodejs语言实现验证码生成功能

    验证码已经是非常常用的反作弊.反攻击手段了,其实要实现这个功能对技术水平好的人也不难,但是并不是每个人,每种语言都天然适合搞某个功能...不过我们可以通过封装接口,来屏蔽差异化,把问题简单化,现在就用 ...

  4. generator自动生成数据表

    1.先写好自己要创建的字段等: 然后将将上面的在plsql中运行,创建数据表.

  5. Jmeter: PATCH方法无法发送参数的暂时解决方法

    Jmeter: PATCH方法无法发送参数的暂时解决方法 最近在做API测试,前面的GET这些HTTP Request方法都无压力,顺利解决. 但碰到PATCH方法时,发现无法通过. 通过对比,发现P ...

  6. python 连接 hive

    1.python连接hive,其实是连接hiveserver,连接的包的impyla impyla安装: error: cc1plus 没有文件或目录 需要安装gcc 和g++,并且版本保持一致 er ...

  7. js大文件上传

    一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不能这样上传了.我这里分享一下我自己开发的一套大文件上传控件 ...

  8. Vue开发工具

    vue微信小程序:mpvue 极客开发工具:Dcloud,uni-app 一套代码多终端. 简书-推荐的Vue UI库 Vue UI: 功能介绍帖子之一  :帖子二 VSCode: 介绍帖子 Vue- ...

  9. SLC cache功能

    由于TLC需要多次编程,且未全部编程时wordLine处于不稳定状态,所以一般都会划出一部分区域作为SLC cache使用 SLC cache主要功能是,SSD接收到写命令后,先将数据写入SLC ca ...

  10. powerDesigner关联数据库显示中文注释

    最近使用powerdesigner,遇到些问题,记录一下[安装过程就略过了] 一.安装odbc驱动 分享下驱动,百度网盘链接:https://pan.baidu.com/s/1UYPq_PEQkDOJ ...