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: '男'}

       注意:如果合并的对象有相同的键,那么后面的键会覆盖前面的键

05-14 01:55