ES6躬行记(5)——对象字面量的扩展
一、简洁属性和方法
当创建对象字面量时,如果属性值是与属性同名的已定义的标识符(例如变量、常量等),那么ES6允许省略冒号和属性值,这样就能避免冗余的初始化。下面分别用传统的键值对和最新的简写方式创建对象字面量,可以明显的看出,第二种书写起来更加精炼。
let name = "strick",
age = 28,
obj;
//键值对的写法
obj = { name: name, age: age };
//只有属性名的简洁写法
obj = { name, age };
属性上的方法也可以用更加简洁、直观的语法来表达。如下代码所示,声明getName()时使用了传统的方式,而声明getAge()时,使用了省略冒号和function关键字的简洁方式。
obj = {
getName: function() { //传统方式
return name;
},
getAge() { //简洁方式
return age;
}
};
注意,简写的方法不支持递归调用,并且只有简写的方法才能支持super对象(将在下面的原型一节中介绍)。
二、计算属性名
对象字面量中的属性名可以用标识符或字符串字面量表示,不仅如此,ES6还允许属性名是要计算的表达式,但需要用方括号包裹,具体如下所示。
obj = {
name, //标识符
"age": age, //字符串字面量
[name + "2"]: "freedom", //要计算的表达式
[name + "3"]() {
return name;
}
};
注意,当属性名是表达式或字符串字面量时,无法使用前面的简洁写法,而用表达式定义的方法不受此限制。
三、原型
在ES6标准的附录B中收入了一个有争议的非标准属性__proto__,这是一个访问器属性,继承自Object.prototype,用于读写对象的原型。虽然现代浏览器都实现了它,但毕竟是一个内部属性并且其它运行环境对它不一定支持,因此不推荐使用。
为了能更灵活地操作对象的原型,ECMAScript标准为Object对象提供了两个静态方法,其中ES5引入了getPrototypeOf()方法获取对象的原型,ES6引入了setPrototypeOf()方法修改对象的原型。此方法的第一个参数是待修改的对象,第二个参数是新原型(一个对象或null),具体使用如下所示。
let chain = {},
proto;
Object.setPrototypeOf(chain, { name: "freedom" });
proto = Object.getPrototypeOf(chain);
console.log(proto === chain.__proto__); //true
上面代码的最后一句做了一次全等比较,比较结果是true,说明运算符左右两边的操作数指向了同一个对象,这也证明了setPrototypeOf()和getPrototypeOf()两个方法可以取代__proto__属性。
ES6新增了super关键字,可指向当前对象的原型,相当于调用Object.getPrototypeOf()方法。注意,super关键字只能出现在简洁方法中,并且必须以调用的方式出现,具体使用如下所示。
let father = {
getName() {
console.log("father");
}
};
let child = {
getName() {
super.getName();
console.log("child");
}
};
Object.setPrototypeOf(child, father);
child.getName(); //先输出"father",再输出"child"
执行上面代码中的super.getName(),相当于执行Object.getPrototypeOf(this).getName()或Object.getPrototypeOf(this).getName.call(this)。注意,当用super关键字调用原型上的方法时,this绑定的是当前对象,而不是原型所指向的对象。下面用代码展示了3种方式调用原型上的getName()方法。
father = {
name: "father",
getName() {
console.log(this.name);
}
};
child = {
name: "child",
getName() {
super.getName(); //"child"
Object.getPrototypeOf(this).getName(); //"father"
Object.getPrototypeOf(this).getName.call(this); //"child"
}
};
Object.setPrototypeOf(child, father);
child.getName();
ES6躬行记(5)——对象字面量的扩展的更多相关文章
- ES6躬行记(1)——let和const
古语云:“纸上得来终觉浅,绝知此事要躬行”.的确,不管看了多少本书,如果自己不实践,那么就很难领会其中的精髓.自己研读过许多ES6相关的书籍和资料,平时工作中也会用到,但在用到时经常需要上搜索引擎中查 ...
- ES6躬行记 笔记
ES6躬行记(18)--迭代器 要实现以下接口## next() ,return,throw 可以用for-of保证迭代对象的正确性 例如 var str = "向
- ES6躬行记(11)——对象
在第5篇中,讲解了多个对象字面量的改进,本节将重点介绍两个新增的静态方法,以及对象属性的重复处理和枚举顺序. 一.Object.is() 此方法用于判断两个值是否相同,内部实现了SameValue算法 ...
- ES6躬行记(21)——类的继承
ES6的继承依然是基于原型的继承,但语法更为简洁清晰.通过一个extends关键字,就能描述两个类之间的继承关系(如下代码所示),在此关键字之前的Man是子类(即派生类),而在其之后的People是父 ...
- ES6躬行记(3)——解构
解构(destructuring)是一种赋值语法,可从数组中提取元素或从对象中提取属性,将其值赋给对应的变量或另一个对象的属性.解构地目的是简化提取数据的过程,增强代码的可读性.有两种解构语法,分别是 ...
- ES6躬行记(20)——类
ES6正式将类(Class)的概念在语法层面标准化,今后不必再用构造函数模拟类的行为.而ES6引入的类本质上只是个语法糖(即代码更为简洁.语义更为清晰),其大部分功能(例如继承.封装和复用等)均可在E ...
- ES6躬行记(2)——扩展运算符和剩余参数
扩展运算符(Spread Operator)和剩余参数(Rest Parameter)的写法相同,都是在变量或字面量之前加三个点(...),并且只能用于包含Symbol.iterator属性的可迭代对 ...
- ES6躬行记(4)——模板字面量
模板字面量(Template Literal)是一种能够嵌入表达式的格式化字符串,有别于普通字符串,它使用反引号(`)包裹字符序列,而不是双引号或单引号.模板字面量包含特定形式的占位符(${expre ...
- ES6躬行记(15)——箭头函数和尾调用优化
一.箭头函数 箭头函数(Arrow Function)是ES6提供的一个很实用的新功能,与普通函数相比,不但在语法上更为简洁,而且在使用时也有更多注意点,下面列出了其中的三点: (1)由于不能作为构造 ...
随机推荐
- php |= 什么意思
- php位运算
php位运算 /** * 位运算 */ echo "<pre>"; $aa = $a&$b; //按位与,相同位都为1时为1,其他都为0; echo " ...
- esxi 精简置备只增不减问题解决方法(转)
esxi 精简置备只增不减问题解决方法 众所周知Thin Provisioning模式下的虚拟机磁盘的空间会随需增长,可以很大程度上帮助我们节约空间,可是,凡增长过后的空间,即使清除了导致增长的文件后 ...
- Cordova打包vue项目生成Apk (解决cordova build android抛出的zip问题)
最近对vue前端框架情有独钟.但研究了一下怎么把vue项目打包成android apk来玩玩. 首先讲一下创建vue2.x项目.其实在之前的文章中都有写过,有兴趣的同学可以去看看.http://www ...
- 浅谈C++ STL
C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量.链表.队列.栈. C++ 标准模板库的核心包括以 ...
- Keepalived+Nginx实现高可用Web负载均衡
1.安装编译 Nginx 所需的依赖包# yum install gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zli ...
- js拼接字符串后swiper不能动的解决方案
swiper的配置一定要放在拼接字符串之后,紧随其后,如果放在其他的位置,swiper是不识别HTML的.
- 用for; while...do; do...while; 写出九九乘法表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- muse-ui底部导航自定义图标和字体颜色
最近在鼓捣用vue.js进行混合APP开发,遍寻许久终于找到muse-ui这款支持vue的轻量级UI框架,竟还支持按需引入,甚合萝卜意! 底部导航的点击波纹特效也是让我无比惊喜,然而自定义图标和字体颜 ...
- Spring源码工程导入Eclsipse缺少两个jar文件
按照<Spring源码深度解析>所述,使用gradle cleanidea eclipse将Spring源码转为eclipse工程后,导入eclipse,最后发现还是缺少spring-cg ...