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


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

一. 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)) // 把键值对数组转化为对象
复制代码

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