object.defineproperty()

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

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