摘要:前言是新增的一個,其作用是給對象的屬性增加更多的控制。使用方法提供了一種直接的方式來定義對象屬性或者修改已有對象屬性。數(shù)據(jù)描述符是一個擁有可寫或不可寫值的屬性。存取描述符是由一對函數(shù)功能來描述的屬性。這也是實(shí)現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵。
前言
Object.defineProperty是ES5新增的一個API,其作用是給對象的屬性增加更多的控制。在我們?nèi)粘5腸oding中,這個API用到的地方不多,然而它對于MVVM框架中雙向數(shù)據(jù)綁定(two-ways data binding)來說是至關(guān)重要的一個API,目前vue和avalon中的雙向數(shù)據(jù)數(shù)據(jù)綁定均是通過它來實(shí)現(xiàn)的。
使用Object.defineProperty方法提供了一種直接的方式來定義對象屬性或者修改已有對象屬性。
語法Object.defineProperty(obj, prop, descriptor)參數(shù)
obj: 需要定義屬性的對象(目標(biāo)對象)
prop: 需被定義或修改的屬性名(對象上的屬性或者方法)
descriptor: 需被定義或修改的屬性的描述符
descriptorobj和prop都比較好理解,我們重點(diǎn)來解析第三個參數(shù)屬性描述符,它是一個對象,里面有以下取值:
value: 屬性的值
var a = {} Object.defineProperty(a, "b", { value: 2 }) console.log(a.b); // => 2
writable: 屬性是否能被重寫(rewrite),默認(rèn)為false
var a = {} Object.defineProperty(a, "b", { value: 2, writable: false }) console.log(a.b); // output 2 a.b = 3 console.log(a.b); // still ouput 2
enumerable: 屬性是否能在for ... in或者Object.keys中被枚舉出,來默認(rèn)為false
var a = {} Object.defineProperty(a, "b", { value: 2, enumerable: false }) console.log(Object.keys(a)) // output [] Object.defineProperty(a, "c", { value: 2, enumerable: true }) console.log(Object.keys(a)) // output ["c"]
configurable: 是否能夠配置value,writable,configurable,默認(rèn)為false
var a = {} Object.defineProperty(a, "b", { value: 2, enumerable: false }) console.log(a.b) // output 2 Object.defineProperty(a, "b", { value: 3, enumerable: true }) // TypeError: Cannot redefine property: b
get: 一個給屬性提供 getter 的方法,默認(rèn)undefined
set: 一個給屬性提供 setter 的方法,默認(rèn)undefined
屬性描述符分為數(shù)據(jù)描述符和存取描述符。數(shù)據(jù)描述符是一個擁有可寫或不可寫值的屬性。存取描述符是由一對 getter-setter 函數(shù)功能來描述的屬性。
數(shù)據(jù)描述符和存取描述符均具有可選鍵值:configurable, enumerable
數(shù)據(jù)描述符同時具有可選鍵值:value,writable,get,set
用思維導(dǎo)圖來表示就是:
get/set對于set和get,我的理解是它們是一對勾子(hook)函數(shù),當(dāng)你對一個對象的某個屬性賦值時,則會自動調(diào)用相應(yīng)的set函數(shù);而當(dāng)獲取屬性時,則調(diào)用get函數(shù)。這也是實(shí)現(xiàn)雙向數(shù)據(jù)綁定的關(guān)鍵。
var a = {} var b Object.defineProperty(a, "b", { get: function() { console.log("get b") // 我們可以在這里對返回的值做任何操作 return b + 1 }, set: function(newValue) { console.log("set b to", newValue) b = newValue } }) a.b = 100 console.log(a.b); /* output: set b to 100 get b 101 */注意
數(shù)據(jù)描述符和存取描述符不能混合使用
Object.defineProperty(o, "conflict", { // value是數(shù)據(jù)描述符 value: 1, // get是存取描述符 get: function() { return 2; } }); // throws a TypeError: value appears only in data descriptors, get appears only in accessor descriptors
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/79181.html
摘要:擱置了幾天我還是決定再次重寫下邊我們來具體聊聊先從開始說起有個定義屬性的功能,應(yīng)該沒幾個人用,因?yàn)橄鄬τ谶@種方式簡直不能再難用。 擱置了幾天我還是決定再次重寫! 下邊我們來具體聊聊先從defineProperty開始說起 defineproperty //defineproperty 有個定義object屬性的功能,應(yīng)該沒幾個人用,因?yàn)橄鄬τ趏bj.a = 1這種方式簡直不能再難用。 ...
摘要:與當(dāng)與同時為時,屬性不能重新使用定義,嚴(yán)格模式下會報(bào)錯示例云麒報(bào)錯當(dāng)或者為時,屬性可以重新使用定義,這一點(diǎn)讀者不妨自行測試。 摘要: JavaScript有個很神奇的Object.defineProperty(),了解一下? =與Object.defineProperty 為JavaScript對象新增或者修改屬性,有兩種不同方式:直接使用=賦值或者使用Object.definePro...
摘要:屬性描述符升級打怪必備技能對象有自己的屬性和方法,對于我們對象的屬性來講,屬性還有自己的屬性,又稱為屬性描述符。這個方法接受三個參數(shù),第一個是指定的對象,第二個是指定的對象參數(shù),第三個當(dāng)然是要修改的屬性描述符了。 對象的聲明有倆種: 字面量 通過new一個構(gòu)造函數(shù)Object 兩者唯一的區(qū)別就是,字面量形式,可以一次賦值多個,通過new Object就得一個一個賦值 數(shù)據(jù)類型 ...
摘要:創(chuàng)建對象創(chuàng)建一個普通對象創(chuàng)建一個沒有原型的新對象不繼承任何屬性和方法返回對象中可枚舉的自我屬性的名稱的數(shù)組返回對象中所有自我屬性的名稱的數(shù)組屬性的特性屬性有兩種特性數(shù)據(jù)屬性和存取器屬性數(shù)據(jù)屬性存取器屬性可以獲得某個對象特定自有屬性的屬性描述 Object.create(o) 創(chuàng)建對象 Object.create({x: 1}) //創(chuàng)建一個普通對象 Object.create(null...
摘要:和的作用一樣,區(qū)別在于寫法語法對象對象作用判斷對象是否在對象的原型鏈上語法對象構(gòu)造函數(shù)作用判斷構(gòu)造函數(shù)的屬性是否在對象的原型鏈上,如果在,就返回屬性是否可枚舉用于檢查給定的屬性是否能夠使用語句。 ## javascript對象原型成員詳解 ## ECMAScript 中的對象就是一組數(shù)據(jù)和功能的集合,對象可以通過 new 操作符后跟要創(chuàng)建的對象名稱來...
閱讀 3160·2021-11-19 09:40
閱讀 3647·2021-11-16 11:52
閱讀 2980·2021-11-11 16:55
閱讀 3171·2019-08-30 15:55
閱讀 1177·2019-08-30 13:08
閱讀 1656·2019-08-29 17:03
閱讀 3012·2019-08-29 16:19
閱讀 2579·2019-08-29 13:43