object object.defineproperty


object.defineProperty()是什么?不知小伙伴来看看小编今天的分享吧!
一、Object.defineProperty()定义:
Object.defineProperty()将新属性直接定义为一个对象,或修改一个对象的现有属性,并返回该对象 。
二、和.操作符或[]操作符的区别:
Object.defineProperty()可以更深入地定义一个对象,它不仅可以操作属性的值,还可以修改属性的一些特征,比如是否可以修改,当然值也是属性的特征之一 。
三、Object.defineProperty(obj,prop,descRIPtor)接受三个参数:
obj: 要操作的对象
prop: 要操作的属性
descriptor: 描述符对象 。包括六个属性:configurable、enumerable、writable、value、get、set
注意:
应当直接在Object在构造对象上调用这种方法,而不是在任何一个Object调用类型实例 。
四、属性类型:
1、数据属性
数据属性包含数据值的位置 。在这个位置读写值
描述其行为的数据属性有四个特征:
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也不行 。
以上是小编今天的分享 。我希望它能帮助你 。
【object object.defineproperty】