视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001 知道1 知道21 知道41 知道61 知道81 知道101 知道121 知道141 知道161 知道181 知道201 知道221 知道241 知道261 知道281
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
object.defineproperty()
2021-12-22 10:54:38 责编:李赢赢
文档

object.defineproperty()是什么呢?不知道的小伙伴来看看小编今天的分享吧!

一、Object.defineProperty()的定义:

Object.defineProperty()会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

二、和.操作符或者[]操作符的区别:

Object.defineProperty()能够更深入地定义一个对象,它操作的不仅仅是属性的值,也可以修改属性的一些特性,比如是否可修改,是否可遍历,当然值也是属性其中的特性之一。

三、Object.defineProperty(obj, prop, descriptor)接受3个参数:

obj: 要操作的对象

prop: 要操作的属性

descriptor: 描述符对象。包含6个属性:configurable、enumerable、writable、value、get、set

注意:

应当直接在Object构造器对象上调用此方法,而不是在任意一个Object类型的实例上调用。

四、属性类型:

1、数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值

数据属性有4个描述其行为的特性:

configurable: 能否通过delete删除属性,能否修改属性特性(注意是特性),能否修改为访问器属性,默认是true

enumerable: 能否通过for-in遍历到该属性,默认是true

writable: 能否修改属性值,默认是true

value: 这个属性的数据值。读取属性值的时候,从这里读取;写入属性值得时候,把新值保存在这个位置。默认是undefined

例如:

let person = {}

person.name // 给person添加一个数据属性,Configurable、Enumerable、Writable默认是true,Value是undefinedperson.name = 'a' // Value特性被设置为'a'

如果将configurable设置为false 那么除了value和writable之外的特性都不能被修改(本身也不能再改为true了),如果修改会被忽略,严格模式会报错。

在configurable为false的情况下,writable为true可修改为false,如果writable为false,修改为true也会被忽略,严格模式报错。

Object.defineProperty(person, 'name', {  configurable: false})Object.defineProperty(person, 'name', {  value: 'b'})console.log(person.name) // b  configurable为false,writable为true时还能修改Object.defineProperty(person, 'name', {  writable: false})

person.name = 'c' // errorObject.defineProperty(person, 'name', {  writable: true}) // error

2、访问器属性

访问器属性不包含数据值,包含一对getter和setter函数(不需要同时存在)。
访问器属性必须通过Object.defineProperty定义。访问器属性有以下四个特性:

configurable: 能否通过delete删除属性,能否修改属性特性(注意是特性),能否修改为数据属性,默认是true

enumerable: 能否通过for-in遍历到该属性,默认是true

get: 在读取属性时调用的函数。默认值是undefined

set: 在写入属性时调用的函数。默认是undefined

五、数据属性和访问器属性相互转换:

数据属性 -> 访问器属性

给数据属性设置了get或set特性,value和writable特性就会被废弃,该属性变为访问器属性

访问器属性 -> 数据属性

给访问器属性设置了value或writable特性,get和set特性就会被废弃,该属性变为数据属性

注意:只有在configurable为true的情况下才可以相互转换,即使数据属性中在configurable为false的情况可以修改value或writable,访问器属性转数据属性只设置value或writable也不行。

以上就是小编今天的分享了,希望可以帮助到大家。

下载本文
显示全文
专题