对象的扩展
2018-08-22 本文已影响0人
陶六六
对象的扩展
- 属性和方法简写
var foo ='bar' var baz = {foo} <=> var baz={foo:foo} var o ={ func(){} } <=> var o ={ func:function(){} }
- 属性名表达式
let foo ={ ['b'+'z']:'baz', *['a'+'b'](){} }
- 可枚举性enumerable
for..in,Object.keys(),JSON.stringify(),Object.assign()
会忽略不可枚举的属性 - 属性的遍历
- for...in 遍历自身和继承的可枚举属性,不含Symbol
- Object.keys(obj) 返回自身的所有可枚举属性键名数组,不含Symbol,配套属性Object.values(obj),Object.entries(obj)规则相同
- Object.getOwnPropertyNames(obj) 返回自身的所有属性键名数组,包含不可枚举,不包含Symbol
- Object.getOwnPropertySymbols(obj) 返回自身的所有Symbol属性的键名数组
- Reflect.ownKeys(obj) 返回自身的所有属性键名数组,包括不可枚举和Symbol
- 描述对象
- Object.getOwnPropertyDescriptor(obj,key) 返回指定键名的描述对象
- Object.getOwnPropertyDescriptors(obj) 返回对象所有自身属性的描述对象
- 原型对象操作
- Object.setPrototypeOf(obj,prototype)
- Object.getPrototypeOf(obj)
- super 指向原型对象 只能用在对象方法上,即通过简写的对象方法,super调用的原型方法内部this指向当前对象而不是原型对象
const foo = { goo:super.foo,//error foo:()=>super.foo,//error doo:function(){ return super.foo },//error find(){ return super.foo }//ok } // super.foo() === Object.getPropertyOf(this).foo.call(this)
tips
- 属性简写和属性名表达式不能同时使用
- Object.is()与===区别
-
+0===-0
而Object.is(+0,-0)=== false
-
NaN!==NaN
而Object.is(NaN,NaN)=== true
-
- Object属性遍历顺序
- 首先遍历数值键,按照数值升序排列
- 其次遍历所有字符串键,按照加入时间升序排列
- 最后遍历所有Symbol键,按照加入时间升序排列