本文内容
属性的简写
ES 5
let name = 'czp';
let age = 25;
let obj = {
name: name,
age: age
};
ES 6
let name = 'czp';
let age = 25;
let obj = {
name,
age
};
这种同名属性我们不用再写 2 遍。(就是个语法糖,我个人觉得挺蠢的,反而增加记忆负担)
方法的简写
ES 5
let obj = {
sayHello: function () {
}
};
ES 6
let obj = {
sayHello() {
}
};
这种简写方式拥有 ES 5 的全部特性,另外,简写方法还可以使用 super 关键字
可计算属性名
ES 5
let obj = {
"ha ha": 3
};
console.log(obj["ha ha"]);
ES 6
let attributeName = "ha ha";
let obj = {
[attributeName]: 3
};
console.log(obj[attributeName]);
ES 6 中,可以在对象字面量中,使用变量来定义属性名称。语法就是将属性名称变量使用中括号括起来,就类似于中括号属性调用一样。
我们也可以用这种方式来定义方法名
let attributeName = "ha ha";
let obj = {
[attributeName]() {
return 3;
}
};
console.log(obj[attributeName]());
甚至,属性名只要是表达式都可以这样来做
let attributeName = "ha ha";
let obj = {
[attributeName + 3]() {
return 3;
}
};
console.log(obj[attributeName + 3]());
新增方法
Object.assign(target, source)
这个方法是一个用来混入的方法,可以将其它对象的属性复制到一个接收对象上,例如
let obj1 = {};
let obj2 = {
name: 'czp',
gender: 'man'
};
let obj3 = {
age: 25,
name: 'xxx'
};
Object.assign(obj1, obj2, obj3);
console.log(obj1);
输出
(py3.5) czp@:~/workspace/knowledge-base/demos/node_start$ node hello.js
{ name: 'xxx', gender: 'man', age: 25 }
它将后两个对象的所有属性都复制到了第一个对象上,称为混入。
靠后的对象的属性的优先级最高,所以 name 字段的值是 obj3.name 的值
Object.assign 方法不能将访问器属性复制到目标对象上,访问器属性会变成一个数据属性
也就是源对象的属性的 get 方法,将会取消,目标对象仅仅是一个固定值
重复字面量属性
在 ES 5 中,如果字面量里包含有重复的属性,那么将会报错。
在 ES 6 中,不会检测重复属性,如果出现重复,将以最后一个为准,例如
let obj = {
name: 'czp',
name: 'aaa'
};
console.log(obj.name); // aaa
自有属性的枚举顺序
在 ES 6 中,严格定义了对象自由属性的枚举顺序:
- 所有数字键按照升序排序
- 所有字符串键按它们被加入对象的顺序排序
- 所有 symbol 键(后续介绍)按它们被加入对象的顺序排序
例如
let obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1: 1
};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join(',')); // 0,1,2,a,c,b,d
可以看到,数字键都在字符串键前面,数字键按照数字来排序,字符串键按照加入顺序排序
对于 for-in 循环,仍然没有明确的顺序,
Object.keys和JSON.stringify()枚举顺序与 for-in 相同,因此也没有明确的顺序这里规定的顺序仅针对
Object.getOwnPropertyNames自有属性
super 关键字
这个关键字只能够用于简写方法中,表示的是访问原型上的方法,例如
let obj = {
hello() {
return 'hello';
},
this() {
return this;
}
};
let obj2 = {
hello() {
return super.hello() + ', czp';
},
this() {
return super.this();
}
};
Object.setPrototypeOf(obj2, obj);
console.log(obj2.hello());
console.log(obj2.this() === obj2); // true
说白了这个就是为了补坑的,这种操作跟 Java 基本是一致的
super 关键字只能用在简写方法中