Object方法(一)

110 阅读3分钟

最近在翻看源码时,发现对一些js的内置对象的方法还不够了解,所以对内置对象的方法做一个汇总

Object.create()

创建一个对象

  1. 常规语法

    const obj = Object.create(proto,[propertiesObject])
    
  2. 参数

    • proto:为需要创建的对象提供原型属性的对象,即对象的原型对象

    • propertiesObject: (可选)

      1. 传入一个对象
      2. 对象的属性参照Object.defineProperties的第二个参数
      3. 若参数不为 undefined,会传入对象自身的可枚举属性
  3. 返回值

    返回一个新对象,带有指定的原型对象和属性

  4. 例子

    首先定义一个原型对象person,然后通过create方法来创建otherPerson这个对象

    const person = {
      name: '小明',
      age: 22,
      sex: 'man'
    }
    const otherPerson = Object.create(person)
    console.log(otherPerson)
    

    输出结果:

    1650296624871.png

    可以看到在执行方法后创建了一个otherPerson这个对象,在这个对象的原型上,则继承了person对象的属性

    1650296876287.png

    可以通过otherPerson.name直接获取原型上的name属性的值。在修改name属性是,会默认为otherPerson新增一个name属性,并没有修改其原型属性的值

    1650297045012.png

    需要通过proto这个属性去访问原型中的属性,并修改属性的值

Object.assign()

用于合并对象(只能合并对象中可枚举的属性),或者复制对象

  1. 常规语法

    Object.assign(target, source);
    
  2. 参数

    • target:目标对象
    • source:源对象
  3. 返回值

    返回合并之后的目标对象

  4. 例子

    const target = {
        a: 1,
        b: 2,
        c: 5
    }
    const source = {
        c: 3,
        d: 4,
    }
    Object.defineProperty(source, 'e', {
        value: 6,
        enumerable: false
    })
    console.log(source)
    console.log(Object.assign(target, source))
    

    输出结果:

    1650378097661.png

    可以看到,在执行方法后将源对象中的属性合并到了目标对象中,其中源对象会将目标对象中的相同属性覆盖。如果源对象中存在不可枚举的属性,这个属性无法被合并到目标对象中。

    如果要复制一个对象,可以将源对象合并到一个空对象中

    const copy = {
        name: 'aaa',
        like: {
            color: 'red'
        }
    }
    const cur = Object.assign({}, copy)
    console.log(cur)
    

    执行结果为

    1650378636536.png

    但是,当我们去改变源对象中的like属性时,会发现

    1650378716848.png

    复制过来的目标对象中的like属性也会随之发生变化,这说明如果源对象的属性中存在对象,Object.assign()只是将其引用拷贝到目标对象中

Object.keys()

主要是获取传入对象的可枚举属性,将其组成数组返回

  1. 常规语法

    Object.keys(obj)
    
  2. 参数

    • obj:要获取可枚举属性的对象
  3. 返回值

    带有可枚举属性组成的字符串数组

  4. 例子

    const obj = {
        a: 1,
        b: 2,
        c: 3
    }
    const arr = ['a', 'b', 'c', 'd']
    Object.defineProperty(obj, 'd', {
        value: 4,
        enumerable: false
    })
    console.log(Object.keys(obj))
    console.log(Object.keys(arr))
    

    执行结果:

    1650379595577.png

    可以看到对象输出了对象中的可枚举属性,数组则返回了其索引值

Object.values()

用于获取目标对象可枚举属性的值

  1. 常规语法

    Object.values(obj)
    
  2. 参数

    • obj:目标对象
  3. 返回值

    一个包含对象自身的所有可枚举属性值的数组

  4. 例子

    const obj = {
        a: 1,
        b: 2,
        c: 3
    }
    Object.defineProperty(obj, 'd', {
        value: 4,
        enumerable: false
    })
    console.log(Object.values(obj))
    

    执行结果:

    1650380555766.png

Object.entries()

用于获取一个对象中可枚举属性的键值对

  1. 常规语法

    Object.entries(obj)
    
  2. 参数

    要获取键值对的数组

  3. 返回值

    键值对数组

  4. 例子

    const obj = {
        a: 1,
        b: 2,
        c: 3
    }
    Object.defineProperty(obj, 'd', {
        value: 4,
        enumerable: false
    })
    console.log(Object.entries(obj))
    

    输出结果

    1650380068412.png