1.方法的name属性
函数的name属性,返回函数名,对象方法也是函数,因此也有name属性
如果对象的方法使用了getter和setter,则name属性不是在该方法上面,而是该方法的属性的描述对象的get和set属性上面,返回值使方法名前加上get和set。
2.Object.is()方法判断是否完全相等
Object.is('foo','foo');//true
Object.is({},{});//false
Object.is(+0,-0);false;
Object.is(NaN,NaN);//true
3.Object.assign方法的第一个参数是目标对象,后面的参数都是源对象(浅拷贝:如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用)
1).null,undefined不能作为目标对象
2)作为源对象的参数,无论是否是对象,若不是,就直接跳过,即null与undefined不在首参数,就不会报错
3)布尔值和数值作为目标对象时,只有字符串的包装对象会产生枚举效果,其它都会被忽略
Object(true) // {[[PrimitiveValue]]: true}
Object(10) // {[[PrimitiveValue]]: 10}
Object('abc') // {0: "a", 1: "b", 2: "c", length: 3, [[PrimitiveValue]]: "abc"}
4)拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性,也不拷贝不可枚举属性)
5)遇见同名属性,Object.assign的处理方法是替换
const target = { a: { b: 'c', d: 'e' } }
const source = { a: { b: 'hello' } }
Object.assign(target, source)
// { a: { b: 'hello' } }
6)只进行值的复制,如果是取值函数,就先取完值再去复制
原始值都在包装对象的内部属性[[PrimitiveValue]]上面,这个属性时不会被Object.assign拷贝的
PS:如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性
用处:1)添加对象属性
2)添加对象方法
3)克隆对象
保持继承链,克隆对象自身的值以及继承的值
function clone(origin){
let originProto=Object.getPrototypeOf(origin);
return Object.assign(Object.create(origninProto),origin);
}
4)合并多个对象
5)为属性指定默认值(浅拷贝,尽量属性值都用简单类型)
4.属性的可枚举性和遍历
Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象
let obj = { foo: 123 };
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
// value: 123,
// writable: true,
// enumerable: true,//可枚举性,如果为false,就表示某些操作会忽略当前属性
// configurable: true
// }
目前,有四个操作会忽略enumerable为false的属性
·for...in循环:只遍历对象自身和继承的可枚举属性
·Object.keys():返回对象自身的所有可枚举的属性的键名
·JSON.stringify()只串行化对象自身的可枚举的属性
·Object.assign忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性
5.Object.getOwnpropertyDescriptors方法 返回某个对象属性的描述对象
1)解决Object.assign()无法正确拷贝get属性和set属性的问题
const shallowMerge = (target, source) => Object.defineProperties(
target,
Object.getOwnPropertyDescriptors(source)
);
2)实现一个对象继承另一个对象
const obj = Object.create(
prot,
Object.getOwnPropertyDescriptors({
foo: 123,
})
);
3)实现Mixin(混入)模式
6.super关键字
this关键字总是指向函数所在的当前对象。
super:指向当前对象的原型对象(super表示原型对象时,只能用在对象的方法中,用在其他地方都会报错)
const obj = {
foo: 'world',
find() {//正确
return super.foo;
}
};
// 报错
const obj = {
foo: super.foo
}
// 报错
const obj = {
foo: () => super.foo
}
7.Object.keys()反hi对象自身的所有的可遍历属性的键名----会排序,键值按键名返回
ES7引入了跟Object.keys配套的Object.values(属性的键值)和Object.enteries(键值对)--------(for...of)
// 报错
const obj = {
foo: function () {
return super.foo
}
}
8.对象的解构赋值用于从一个对象取值,相当于将目标对象自身所有可遍历的,但尚 被读取的属性,分配到指定的对象上面。
所有的键和值都会拷贝到新对象上面(null,undefined报错)
1)扩展运算符可用于合并俩个对象
let ab={...a,...b}====let ab=Object.assign({},a,b);
2)如果用户自定义的属性,放在扩展运算符后面,则扩展运算符内部的同名属性会被覆盖掉
3)扩展运算符后面可以跟表达式
4)如果扩展运算符后面时i一个空对象,则没有任何效果
5)如果扩展运算符的参数是null和undefined,这两个值会被忽略,不会报错
6)扩展运算符的参数对象中,如果有取值函数get.这个函数是执行的