一、es6对象拓展
(1)对象中变量和函数的简写
es6中,对象和函数可以直接写在大括号中,简便省事。
let a = 123,b = {a,c(){console.log(this.a)}}
用于返回值,导出模块都很方便
function foo (x, y){return {x, y}}let a = 123,b = 'b';module.exports = {foo, a, b}
属性复制器也是一种简写(getter、setter)
(2)属性名表达式
js中,属性名有两种书写方式:
a.标志符
let a = {name : 'a'}
b.表达式,可以拼接
let a = 'a',b = {a},c = { [ a + b.a ] : 'c'};console.log(b, c) // => { a : 'a' } , { 'aa' : 'c' }
如果表达式里为非字符串,系统会将其转化为字符串
let obj = {};obj[{}] = 1;obj[null] = 'null';console.log(obj) // => { '[object Object]' : 1, 'null' : 'null' }
注意点: 属性名简写和属性名表达式不能同时使用
let a = 'a',b = {[a]}; // 报错
(3)获取对象自身属性描述信息 Object.getOwnPropertyDescriptor
是Object的静态方法。有两个参数,
1、目标对象
2、属性字符串
返回一个对象,有四个属性
a.value 属性的值
b.writable 是否可以修改
c.enumerable 是否可以被遍历
d.configurable 是否可以修改或者删除
上面四个属性都为数据描述符,
d. getter
e. setter
上面两个属性为存储描述符,getter和setter函数通过Object.getOwnPropertyDescriptor获取。字面量设置getter和setter,获取得属性描述信息中,confiurable和enumerable为true,没有writable属性,getter.name 为 (get + 函数名)
(4)Object.defineProperty,用来定义或修改现有属性
Object.definedProperty( obj, prop, descriptor )
注意点: value 或 writable 和 getter 或 setter不能同时存在,否则会报错
Object.defineProperty设置的属性数据描述符默认为false,字面量添加属性方式,数据描述符为true
let object= {},theDescriptor ={configurable: true,enumerable: true,writable: true,value: 123,get(){return this.value},set(val){if(val < 10 ){console.log( 'val太小了' )}else{this.value = val}}};Object.defineProperty(object, 'prop', theDescriptor)
修改与删除的情况。
a. writable, 控制是否可以修改。 为false时,修改相关对象属性,非严格模式会静默失败,严格模式下会报错。
b. configurable, 控制是否可以删除 为false时,属性不可删除。
(5)属性赋值器(getter、setter)
对象查找属性时,执行了一个隐式方法[[get]],赋值时执行了[[put]]操作;
[[get]]操作:
(1)先找getter,如果没有对应getter
(2)再沿着原型链找
[[put]]操作:
(1)先找setter,有就执行
(2)判断writable,如果为false,则停止修改
(3)如果writable为true,赋值
let obj = {realName: 'selfName',get name(){return this.realName},set name(val){this.realName = 'set' + val}}console.log(obj.name)obj.name = 'frank'console.log(obj)
