[TOC] #### 1. 前言 --- 眾所周知,默認(rèn)情況下我們可以任意對(duì)自己定義的對(duì)象進(jìn)行增刪改的。但是,在某些情況下,我們不能讓別人去隨便修改我們定義的對(duì)象的屬性,那么我們應(yīng)該怎么處理呢 ?這就需要了解下對(duì)象的屬性特征了。 ```javascript const user = { name: 'liang', age: 18 } // 默認(rèn)情況下,我們可以對(duì)定義的對(duì)象任意增刪改 user.height = 180 delete user.age user.name = 'yang' ``` #### 2. 什么是對(duì)象的屬性特征 --- 獲取對(duì)象的某個(gè)自有屬性的屬性描述,也就是屬性特征 ```javascript // 獲取對(duì)象的自有屬性的屬性描述 const feature = Object.getOwnPropertyDescriptor(user, 'name') // 獲取對(duì)象所有自有屬性的屬性描述 const featureAll = Object.getOwnPropertyDescriptors(user) ``` 變量 feature 返回值示例: ```json { "value":"liang", "writable":true, "enumerable":true, "configurable":true } ``` #### 3. 靈活控制對(duì)象的屬性特征 --- `Object.defineProperty()` 方法用于在對(duì)象上定義一個(gè)新屬性或修改一個(gè)對(duì)象的現(xiàn)有屬性 Object.defineProperty(對(duì)象, 屬性, 屬性描述)。屬性描述也就是 Object.getOwnPropertyDescriptor 的返回值 ``` // user.name 屬性不存在就是新增屬性操作,存在就是修改屬性操作 Object.defineProperty(user, 'name', { value: "zhangsan" }) ``` **屬性特征之 value:表示該屬性對(duì)應(yīng)的值** ```javascript // 將 name 屬性值修改為 100 Object.defineProperty(user, 'name', { value: 100 }) ``` **屬性特征之 writable: 表示能否修改屬性值 true 能改 false 不能修改** ```javascript // writable 設(shè)置為 false Object.defineProperty(user, 'name', { writable: false }) // name 不能修改,但是此處修改了 // 在嚴(yán)格模式下會(huì)拋出錯(cuò)誤 // 雖然在非嚴(yán)格模式不會(huì)拋出錯(cuò)誤,但也不會(huì)修改成功 user.name = 'updated name' ``` **屬性特征之 enumerable: 表示是否可以通過(guò) for-in 訪(fǎng)問(wèn)屬性, 或通過(guò) Object.keys() 獲取** ```javascript // enumerable 表示屬性是否會(huì)出現(xiàn)在對(duì)象的枚舉屬性中 false 不在對(duì)象的枚舉屬性中 Object.defineProperty(user, 'name', { enumerable: false }) ``` **屬性特征之 configurable: 表示屬性特征是否能被改變,當(dāng)為 true 時(shí),屬性特征才能被改變,同時(shí)該屬性也能被刪除** ```javascript // configurable: false 代表屬性特征不能被修改了 Object.defineProperty(user, 'name', { configurable: false }) // 注意: 設(shè)置了 configurable: false,可以設(shè)置 value 和 writable,但不能修改 enumerable Object.defineProperty(user, 'name', { value: 120 }) Object.defineProperty(user, 'name', { writable: false }) // 因?yàn)樯厦娑x了 configurable: false,所以在修改屬性特征會(huì)報(bào)錯(cuò) Object.defineProperty(user, 'name', { enumerable: false }) // 因?yàn)樯厦娑x了 configurable: false,所以無(wú)法刪除屬性 // 在非嚴(yán)格模式下刪除屬性不會(huì)拋出錯(cuò)誤,但在嚴(yán)格模式下刪除屬性時(shí)會(huì)拋出錯(cuò)誤 delete user.name ``` 補(bǔ)充: 可以使用 Object.defineProperties() 批量定義屬性或修改屬性特征 ```javascript Object.defineProperties(user, { name: { value: "maria", writable: false, enumerable: false, configurable: false }, age: { value: 20, writable: false, enumerable: false, configurable: false } }) ``` #### 4. configurable: false 是單向設(shè)置的 --- ```javascript // configurable: false 是單向改變的 // 也就是無(wú)法再修改為 configurable: true Object.defineProperty(user, 'name', { configurable: false }) // 拋出錯(cuò)誤 Object.defineProperty(user, 'name', { configurable: true }) ``` #### 5. 關(guān)于對(duì)象的屬性特征相關(guān)文章推薦 --- [js中Object.defineProperty()和defineProperties()](http://t.zoukankan.com/lc-ant-p-9025430.html "js中Object.defineProperty()和defineProperties()")