属性初始值的简写
function createPerson(name, age) {
return {
name,
age
};
} 对象方法的简写
var person = {
name: 'angela',
sayName() {
console.log(this.name)
}
}可计算属性名
let lastName = 'last name';
var person = {
"first name": 'Li',
[lastName]: 'yun hua'
}方括号中内容同样可以使用表达式作为属性的可计算名称
var suffix = 'name'
var person = {
['first ' + suffix]: 'Li',
['last ' + suffix]: 'yun hua'
}也就是说任何可用于对象实例括号记法的属性名同样可以作为对象字面量中计算属性名
Object.is
对Object.is方法来说,其运算结果大部分情况与===运算符相同,唯一区别在于+0和-0被识别为不相等,NaN和NaN被识别为相等
Object.assign
Object.assign方法接受任意数量的源对象,并按指定的顺序将属性复制到接收对象中,所以如果多个源对象具有同名属性,则排位靠后的源对象会覆盖排位靠前的
有一个需要特别注意的点是Object.assign方法不能将提供者的访问器属性复制到接收对象中,由于Object.assign执行了赋值操作,因此提供者的访问器属性最终会被转变为接收对象中的一个数据属性
var receiver = {},
supplier = {
get name() {
return "file.js"
}
}
Object.assign(receiver, supplier)
var desc = Object.getOwnPropertyDescriptor(receiver, "name") // {value: "file.js",
writable: true,enumerable: true,configurable: true}
console.log(desc.value)//file.js
console.log(desc.get)//undefined重复的对象字面量属性
"use strict";
var person = {
name: "Nicholas",
name: "Greg" // 在 ES5 严格模式中是语法错误
}; 在 ES5 严格模式下运行时,第二个 name 属性会造成语法错误。但 ES6 移除了重复属性的 检查,严格模式与非严格模式都不再检查重复的属性。当存在重复属性时,排在后面的属性 的值会成为该属性的实际值
自有属性的枚举顺序
而 ES6 则严格定 义了对象自有属性在被枚举时返回的顺序。Object.getOwnPropertyNames() 与Reflect.ownKeys (详见第十二章)如何返回属性造成了影响,还同样影响了 Object.assign() 处理属性的顺序
自有属性枚举时基本顺序如下:
1. 所有的数字类型键,按升序排列。
2. 所有的字符串类型键,按被添加到对象的顺序排列。
3. 所有的符号类型(详见第六章)键,也按添加顺序排列。
修改对象的原型
Object.getPrototypeOf() 方法来从任意指定对象中获取其原型
Object.setPrototypeOf() 方法允许你修改任意指定对象的原型。它接受两个参数:需要被修改原型的对象,以及将会成为前者原型的对象
使用 super 引用的简单原型访问
若要覆盖对象实例的一个方法、但依然要调用原型上的同名方法
let person = {
getGreeting() {
return "Hello";
}
};
let friend = {
getGreeting() {
return Object.getPrototypeOf(this).getGreeting.call(this) + ", hi!";
}
};
// 将原型设置为 person
Object.setPrototypeOf(friend, person);
console.log(friend.getGreeting()); // "Hello, hi!"super 是指向当前对象的原型的一个指针,实际上就是 Object.getPrototypeOf(this) 的值
let friend = {
getGreeting() { return super.getGreeting() + ", hi!"; }
};
你能使用 super 引用来调用对象原型上的任何方法,只要这个引用是位于简写的方法之内
方法是一个拥有 [[HomeObject]] 内部属性的函数,此内部属性指向该方法所属的对象
任何对 super 的引用都会使用 [[HomeObject]] 属性来判断要做什么。
1:是在 [[HomeObject]] 上调用 Object.getPrototypeOf() 来获取对原型的引用;
2:在该原型上查找同名函数;
3:创建 this 绑定并调用该方法