ES6(四)扩展的对象功能2
1.重复的对象字面量属性
2.自有属性的枚举顺序
3.修改对象的原型
4.正式的“方法”定义
5.总结
重复的对象字面量属性
ES5 严格模式为重复的对象字面量属性引入了一个检查,若找到重复的属性名,就会抛出错
误。
ES5:
"use strict";
ES5:
var person = {
name: "Nicholas",
name: "Greg" // 在 ES5 严格模式中是语法错误
};
ES6 移除了重复属性的 检查,严格模式与非严格模式都不再检查重复的属性。当存在重复属性时,排在后面的属性 的值会成为该属性的实际值.
"use strict";
var person = {
name: "Nicholas",
name: "Greg" // 在 ES6 严格模式中不会出错
};
console.log(person.name); // "Greg"
自有属性的枚举顺序
ES5 并没有定义对象属性的枚举顺序,而是把该问题留给了 JS 引擎厂商。
而 ES6 则严格定义了对象自有属性在被枚举时返回的顺序
有属性枚举时基本顺序如下:
1. 所有的数字类型键,按升序排列。
2. 所有的字符串类型键,按被添加到对象的顺序排列。
3. 所有的符号类型键,也按添加顺序排列。
for-in 循环的枚举顺序仍未被明确规定,
因为并非所有的 JS 引擎都采用相同的方式。
而 Object.keys() 和 JSON.stringify()
也使用了与 for-in 一样的枚举顺序
var obj = {
a: 1,
0: 1,
c: 1,
2: 1,
b: 1,
1: 1
};
obj.d = 1;
console.log(Object.getOwnPropertyNames(obj).join("")); // 012acbd
修改对象的原型
let person = {
getGreeting() {
return "Hello";
}
};
let dog = {
getGreeting() {
return "Woof";
}
};
// 原型为 person
let friend = Object.create(person); // 创建一个对象
console.log(friend.getGreeting()); // "Hello"
console.log(Object.getPrototypeOf(friend) === person); // true 任意指定对象中获取其原型
// 将原型设置为 dog
Object.setPrototypeOf(friend, dog);
// 此方法允许你修改任意指 定对象的原型。
// 它接受两个参数:需要被修改原型的对象,以及将会成为前者原型的对象。
console.log(friend.getGreeting()); // Woof
console.log(Object.getPrototypeOf(friend) === dog); // true
正式的“方法”定义
ES6 之前,“方法”的概念从未被正式定义,它此前仅指对象的函数属性(而非数据属 性)。
ES6 则正式做出了定义:方法是一个拥有[[HomeObject]] 内部属性的函数,
let person = {
// 方法
getGreeting() {
return "Hello";
}
};
// 并非方法
function shareGreeting() {
return "Hi!";
}
总结
对象是 JS 编程的中心。