一、es6对象拓展
    (1)对象中变量和函数的简写
    es6中,对象和函数可以直接写在大括号中,简便省事。

    1. let a = 123,
    2. b = {
    3. a,
    4. c(){
    5. console.log(this.a)
    6. }
    7. }
    1. 用于返回值,导出模块都很方便
    1. function foo (x, y){
    2. return {x, y}
    3. }
    4. let a = 123,
    5. b = 'b';
    6. module.exports = {foo, a, b}

    属性复制器也是一种简写(getter、setter)

    (2)属性名表达式
    js中,属性名有两种书写方式:
    a.标志符

    1. let a = {name : 'a'}

    b.表达式,可以拼接

    1. let a = 'a',
    2. b = {a},
    3. c = { [ a + b.a ] : 'c'};
    4. console.log(b, c) // => { a : 'a' } , { 'aa' : 'c' }

    如果表达式里为非字符串,系统会将其转化为字符串

    1. let obj = {};
    2. obj[{}] = 1;
    3. obj[null] = 'null';
    4. console.log(obj) // => { '[object Object]' : 1, 'null' : 'null' }

    注意点: 属性名简写和属性名表达式不能同时使用

    1. let a = 'a',
    2. 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

    1. let object= {},
    2. theDescriptor =
    3. {
    4. configurable: true,
    5. enumerable: true,
    6. writable: true,
    7. value: 123,
    8. get(){
    9. return this.value
    10. },
    11. set(val){
    12. if(val < 10 ){
    13. console.log( 'val太小了' )
    14. }else{
    15. this.value = val
    16. }
    17. }
    18. };
    19. 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,赋值

    1. let obj = {
    2. realName: 'selfName',
    3. get name(){
    4. return this.realName
    5. },
    6. set name(val){
    7. this.realName = 'set' + val
    8. }
    9. }
    10. console.log(obj.name)
    11. obj.name = 'frank'
    12. console.log(obj)