1.属性的简洁表达式
const number = "张三";
const obj = { number }; //变量名就是属性名
console.log(obj); //{number:"张三"}
等价于:
const obj1 = { number: "张三" };
2.方法简写
const obj2 = {
name: "张三",
tell() {
console.log(`我的名字是${this.name}`);
},
};
obj2.tell(); //我的名字是张三
注意: 简写的对象的方法不能用作构造函数,会报错
3.属性名表达式
const obj3 = {
tell() {
console.log("我是tell方法");
}
}
obj3.tell() //我是tell方法
obj3["t" + "ell"]() //我是tell方法
注意:属性名表达式与简洁表示法,不能同时使用,会报错
易错:
const various = "water"
const various1 = "pot"
const word = { [various]: various1 }
const word1 = { various: various1 }
console.log(word); //{water: 'pot'}
console.log(word1); //{various: 'pot'}
注意: 区别是[various]作为函数属性是windows.various,而various是作为对象的属性名
如果属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串
const objkey = { a: "张三" }
const obj4 = {
[objkey]: "王二"
}
console.log(obj4); //{[object Object]: '王二'}
4.方法name属性
说明:函数的方法也是函数
const obj5 = {
good() {
}
}
console.log(obj5.good.name); //good
注意:两种特殊情况,bind创建的函数,name属性会返回bound加原函数的名字,Function构造函数创造的函数,name属性返回annoymous
5.属性的可枚举性和遍历
说明:对象的每个属性都有一个描述对象,用来控制属性的行为。Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。
const obj6 = {
name: "张三"
}
console.log(Object.getOwnPropertyDescriptor(obj6, "name"));
//{value: '张三', writable: true, enumerable: true, configurable: true}
6.遍历对象的属性
const obj7 = {
name: "张三",
age: 18
}
6.1 for in
for (let i in obj7) {
console.log(i);
//name
//age
}
6.2 Object.keys()
const obj8 = Object.keys(obj7)
console.log(obj8); //['name', 'age']
6.3 Object.getOwnPropertyNames()
const obj9 = Object.getOwnPropertyNames(obj7)
console.log(obj9); // ['name', 'age']
6.4 Object.getOwnPropertySymbols
const obj10 = Object.getOwnPropertySymbols(obj7)
// 包含对象自身的所有 Symbol 属性的键名。
console.log(obj10); // //[] 没有
6.5 Reflect.ownKeys()
console.log(Reflect.ownKeys(obj7)); //['name', 'age']
7.super关键字
说明:super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。
const obj11 = {
name: "张三"
}
const obj12 = {
name: "李四",
love() {
return console.log(super.name)
}
}
说明:Object.setPrototypeOf() 方法设置一个指定的对象的原型到另一个对象
Object.setPrototypeOf(obj12, obj11)
obj12.love() //张三
也可以使用call(),apply(),bing()等方法 ,改变对象
obj12.love.call(obj11) //张三
8.对象的解构赋值
let { a, b, ...d } = { a: 1, b: 3, c: 5, d: 8 }
console.log(a, b); //1 3
console.log(d); //{c: 5, d: 8}
说明:上述代码变量d是解构赋值所在的对象,将等号右边的所有尚未读取的键,将值一起拷贝过来。
9.扩展运算符
let obj13 = {
name: "张三",
age: 18
}
console.log({ ...obj13 }); //{name: '张三', age: 18}
10.合并对象
let obj14 = {
name: "张三",
age: 12
}
let obj15 = {
name: "李四",
gender: "男"
}
方法1:使用扩展运算符...
console.log({ ...obj14, ...obj15 }); //{name: '李四', age: 12, gender: '男'}
方法2:Object.assign()
console.log(Object.assign(obj14, obj15)); //{name: '李四', age: 12, gender: '男'}
注意:如果合并的对象有相同的键,那么后面的键会覆盖前面的键