js 对对象的操作


highlight: a11y-dark

theme: vuepress

文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

1、Object.defineProperty(obj, prop, descriptor) 参数的含义:

obj — 要进行操作的对象 prop — 对对象中的那个属性进行操作,当写入的属性不存在时,就会给一个参数(对象中—),去添加这个属性 descriptor — 属性描述符,对属性(第二个参数)进行操作(属性描述符:数据属性、存取属性)

示例:

```javascript let obj = { name: '里斯', age: 22 }

// 属性描述符 是一个对象 Object.defineProperty(obj, 'sex', { value: 'max' // 默认值 undefined })

console.log(obj) ```

image-20221209000143154

2、属性描述符 的分类

1)数据属性(数据属性一般都存在value,value 的默认值是 undefined)

① configurable

false 代表该属性不可删除,也不可修改

默认值: false

```javascript let obj = { name: '里斯', age: 22 }

// 属性描述符 是一个对象 Object.defineProperty(obj, 'sex', { value: 'max', /** * false 该属性不可删除 * false 该属性不可修改 */ configurable: false }) delete obj.sex

console.log(obj) ```

② enumerable 表示属性是否可以通过for-in或者Object.keys()返回该属性

是否可以枚举

默认值: false

```javascript let obj = { name: '里斯', age: 22 }

// 属性描述符 是一个对象 Object.defineProperty(obj, 'sex', { value: 'max', enumerable: false

})

console.log(Object.keys(obj)) // ['name', 'age'] 为 false 时,不可得到新增的 sex ,但是你使用的时候 不影响 ```

③ writable 表示是否可以修改属性的值

默认值: false

```javascript let obj = { name: '里斯', age: 22 } // 属性描述符 是一个对象 Object.defineProperty(obj, 'sex', { value: '男', writable: false })

obj.sex = '女'

console.log(obj) // {name: '里斯', age: 22, sex: '男'} ```

2)存取属性

注:存取属性描述符中 get 、set 不能和 writable 、value 共存。

```javascript let obj = { name: '里斯', age: 22, sex: '男' } // 存取属性描述符,可以把你不想暴露出去的私有属性,换个方式 暴露出去 Object.defineProperty(obj, 'sex', { enumerable: true, configurable: true, get: function (){ return this.sex }, set: function (value){ this._sex = value } })

console.log(obj)

obj.sex = '女'; console.log(obj) ```

① 隐藏某一个私有属性,但希望外界使用和赋值的时候使用;

② 如果我们希望截获一个属性,它访问和赋值的过程,也可以使用 存取属性描述符。

3、定义多个属性

```javascript let obj = {};

Object.defineProperties(obj, { neme: { value: '里斯', // 里面的配置 与 defineProperty 相同 }, age: { value: 22 } }) console.log(obj) // {neme: '里斯', age: 22} ```

4、简单的写法

```javascript // 简单写法,但不可 精准控制 let obj = { name: '里斯', age: 22, set age(value) { this.age = value }, get age(){ return this._age } }

obj.age = 25;

console.log(obj.age) ```

image-20221210215915976

5、获取属性描述符

```javascript let obj = {} Object.defineProperties(obj, { name: { value: '里斯', // 里面的配置 与 defineProperty 相同 }, age: { value: 22 } }) console.log(obj) // {name: '里斯', age: 22}

// 获取单个 console.log(Object.getOwnPropertyDescriptor(obj, 'name')) // {value: '里斯', writable: false, enumerable: false, configurable: false}

// 获取所有 console.log(Object.getOwnPropertyDescriptors(obj)) ```

6、禁止给对象添加新的属性

```javascript let obj = { name: '里斯' }

// 禁止给对象添加新的属性 Object.preventExtensions(obj)

obj.age = 22 obj.sex = '女'

console.log(obj) // { name: '里斯' } ```

7、禁止配置 或 删除的属性

1)自己实现

```javascript let obj = { name: '里斯', age: 25 }

// 禁止配置 或 删除的属性 for(let key in obj){ Object.defineProperty(obj, key, { configurable: false, enumerable: true, writable: true, value: obj[key] }) }

delete obj.age

console.log(obj) ```

2)seal 的使用

```javascript let obj = { name: '里斯', age: 25 }

// 禁止配置 或 删除的属性 Object.seal(obj)

delete obj.age

console.log(obj) ```

8、禁止删除对象中的属性

```javascript let obj = { name: '里斯', age: 25 }

Object.freeze(obj)

obj.name = '哈哈' console.log(obj) ```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值