js中Object那些不常用的方法

244 阅读4分钟

算是一个记录练习把,或者是回顾一下编辑器自动补出来的方法,或许有一些只是看着熟悉,但是没用过呢? 比如下面这样

一个点引出了很多方法,但是你真的用过这些吗?

  • 一. Object属性

    Object.length 【值为 1】

    Object.prototype 【老相识了,给对象添加属性】

  • 二.Object方法

    1、Object.assign(target, source): 通过复制一个或多个对象来创建一个新的对象

      1.会复制后面的源对象到前面的目标对象,不会忽略symbol,也不会忽略null和undefined、
      2.该方法我们经常用于前后端处理数据的时候合并对象
      3.如果有相同的属性,则后面的源对象覆盖前面的源对象,最后覆盖目标对象
    
    Object.assign({}, obj1, obj2, obj3)
    

    2、Object.keys()、Object.values()、Object.entries() 这三个方法我们算是常用的了,都返回数组,只不过返回值不一样

      keys返回的是可枚举属性组成的数组
      values返回的是可枚举属性的值组成的数组
      entries返回键值对数组
    
    Object.entries({a: 1}, {b: 2}) // [["a", 1], ["b", 2]]
    
      我们可以把获取到的数组再进行遍历等操作
    

    3、Object.defineProperties(obj, props) 在对象上定义新属性,或者修改现有属性,然后返回对象,obj就是目标对象,props是我们设定的时候各种参数,具体的字段可以自行查阅,这里举一个例子

    var obj = {}
    Object.defineProperties(obj, {
      'a': {
        writable: true,
        value: 'aaa'
      },
      'b': {
        writable: false,
        value: 'bbb'
      }
    })
    obj.a = 'aaaa'
    obj.b = 'bbbb'
    
      当我们定义好了obj之后,可以看到a和b定义的时候writable的不同,我理解为可写,是可以被赋值、
      被改变的,如果是false的时候,就会报错,大家不妨试试
    

    4、Object.defineProperty(obj, prop, descriptor) 是不是发现和上面的这个方法很像啊,前一个算是可以同时加好几个属性,当前的这个方法只能加一个,直接看一个例子

    Object.defineProperty(obj, 'a', {
      enumerable: false, // 置为true的时候,才能出现在枚举属性中
      configurable: false, // 该属性才能被改变,同时该属性能在对象上被删除
      writable: true,
      value: '测试'
    })
    

    5、Object.freeze() 冻结大法。冻结一个对象,使其不能被新增属性、删除、改写等操作。

    var obj = {a : 1}
    Object.freeze(obj)
    Object.defineProperty(obj, 'a', {
        value: '修改一下'
    }) // 报错 TypeError: Cannot redefine property: a
        
    obj.a = 'ccc' //如果直接赋值的话 
       // TypeError: Cannot assign to read only property 'a' of object '#<Object>'
    

    6、Object.isFrozen(obj) 顾名思义,判断是不是被冻结,返回的肯定是一个Boolean了


    7、Object.seal()、Object.isSealed() 密封和判断是否被密封。密封是在当前对象属性的基础上,进行封闭,不让添加和修改属性,如果已有属性是可写的,那就可以改变,否则不能改变。

    var obj = {a : '1'}
    
    Object.seal(obj)
    
    obj.a = '2' // 可写
    
    Object.defineProperty(obj, 'b', {
      writable: true,
      value: '测试'
    }) // 报错 不能添加
    
    delete obj.a // 报错 不能删除
    

    8、Object.getOwnPropertyNames() 返回对象的属性名组成的数组,包括不可枚举属性,但是不包括Symbol类型的属性

    let getObjs = { a: 1, b: 2, c: 3}
    const arr = Object.getOwnPropertyNames(getObjs) ['a', 'b', 'c']
    
    ------------------------------------------------------------------------
    getObjs[Symbol('foo')] = 'symbol' // 添加一个symbol属性
    Object.getOwnPropertyNames(getObjs) // ['a', 'b', 'c'] 还是a\b\c
    
    

    9、Object.getOwnPropertySymbols() 返回对象属性为Symbol的。 还是跟着上面的例子

    const arr1 = Object.getOwnPropertySymbols(getObjs) [Symbol(foo)]
    是不是只返回了symbol的
    

    10、Object.getOwnPropertyDescriptor() 返回一个单个属性的描述符,就是我们上面多次提到的descriptor,比如defineProperty的第三个参数

    let des = Object.getOwnPropertyDescriptor(getObjs, "a") 
    -------------------------------------------------------
    // 返回值是对象 默认是下面的形式
    {
        configurable: true
        enumerable: true
        value: 1
        writable: true
    }
    

    11、Object.getOwnProperty返回一个所有属性的描述符,可以和上面的一个做比较,一个是返回指定属性,一个是所有属性,注意返回值是一个数组

    12、Object.fromEntries() 把键值对列表转化为一个对象,前面的时候我们知道了entries,是把对象转化为键值对的数组

    var obj = {
        a: 'a1',
        b: 'b1',
        c: 'c1'
    }
    
    Object.entries(obj) // [["a", "a1"], ["b", "b1"], ["c", "c1"]]
    
    Object.fromEntries(Object.entries(obj)) // 把键值对数组转化为对象
    

    虽说我们在使用的时候,只会用到常用的一些循环,其余的还是要作为了解,作为知识储备知道的,保不齐哪天就能拿来撩妹了呢?