object.defineproperty()(object)

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也不行。

以上是小编今天的分享。我希望它能帮助你。

- END -

阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。