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)由于不能作为构造 ...
随机推荐
- eclipse自身导致的项目问题:上边提示需要移除无用包,下边类提示需要导入包。
- 在IDEA中spring程序可以正常运行,但IDE报错Could not autowire.
这个问题只会在使用xml文件配置bean时遇到,使用自动配置和java配置没有这种错误. 遇到这个问题首先要确定配置文件已经正确的放在了resources文件夹内,resources文件夹就是clas ...
- 【尺取法】Jurisdiction Disenchantment
[尺取法]Jurisdiction Disenchantment PROBLEM 时间限制: 1 Sec 内存限制: 128 MB 题目描述 The Super League of Paragons ...
- 远程dump导出svn项目
使用TortoiseSVN 安装目录下的svnrdump.exe 工具进行导出 1.cmd 到工具路径下 C:\Program Files\TortoiseSVN\bin svnrdump.exe d ...
- 818C.soft thief
Yet another round on DecoForces is coming! Grandpa Maks wanted to participate in it but someone has ...
- DRC错误解决办法
一.WARNING(ORCAP-1589): Net has two or more aliases - possible short? 错误原因:一个网络有两个网络标号,可能造成短路! 问题本质:原 ...
- COOKIE和Session的原理及异同
COOKIE和Session的原理及异同 1. cookie的创建和读取 cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的w ...
- 让MEF插上AOP的翅膀
什么是MEF Git:https://github.com/MicrosoftArchive/mef MEF也是一款ioc框架,貌似历史比较悠久了. 这里有一篇.net阵容里面主流ioc比较. htt ...
- 用R处理一组数据的三种方式
USArrests是R附带的一个数据集,现在我们需要创建一个factor向量urbancat,如果UrbanPop列的某个值在中位数之上,就把urbancat对应位置的值设为1,否则设为0. 这种数据 ...
- [Bash]LeetCode194. 转置文件 | Transpose File
Given a text file file.txt, transpose its content. You may assume that each row has the same number ...