實(shí)現(xiàn)的步驟:
1.監(jiān)聽(tīng)對(duì)象屬性的讀取與變化
Object.defineProperty() 方法會(huì)直接在對(duì)象上定義一個(gè)新的的屬性,或者已經(jīng)存在的屬性并且返回這個(gè)屬性
語(yǔ)法是 Object.defineProperty(obj, prop, descript)
obj: 目標(biāo)對(duì)象
prop: 需要定義或修改的屬性的名字
descript: 將被定義或修改的屬性的描述符
描述:
這個(gè)方法精確添加或修改對(duì)象的屬性,我們添加的屬性是可以枚舉的屬性(Object.keys()/ for...in)
對(duì)象里面存在是屬性描述存在的形式是:
數(shù)據(jù)描述符:擁有可寫(xiě)入或不可以寫(xiě)入的屬性(相當(dāng)于口令密碼)
存取描述符:由一對(duì)getter-setter 函數(shù)功能來(lái)描述的屬性(方法)
注意:**描述符**必須是兩種形式之一,不能同時(shí)是兩者。
數(shù)據(jù)描述符和存取描述符均具有以下可選鍵值:
1.configurable:當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,也能夠被刪除。默認(rèn)為 false
2.enumerable:當(dāng)且僅當(dāng)該屬性的 enumerable 為 true 時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為 false
數(shù)據(jù)描述符:
1.value:該屬性對(duì)應(yīng)的值。可以是任何有效的 JavaScript 值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為 undefined。
2.writable:當(dāng)且僅當(dāng)該屬性的 writable 為 true 時(shí),該屬性才能被賦值運(yùn)算符改變。默認(rèn)為 false。
存取描述符同時(shí)具有以下可選鍵值:
1.get:一個(gè)給屬性提供 getter 的方法,如果沒(méi)有 getter 則為 undefined。該方法返回值被用作屬性值。默認(rèn)為 undefined。
2.set:一個(gè)給屬性提供 setter 的方法,如果沒(méi)有 setter 則為 undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認(rèn)為 undefined。
示例:
創(chuàng)建屬性
var o = {};Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable : true});console.log(o.a);Object.defineProperty(o, "b", {get : function(){ /*console.log( bValue)*/ return value }, set : function(newValue){ bValue = newValue; }, enumerable : true, configurable : true});o.b = 38;修改屬性
當(dāng)屬性特性(property attribute) writable 設(shè)置為false時(shí),表示 non-writable,屬性不能被修改。
var o = {}; // 創(chuàng)建一個(gè)新對(duì)象Object.defineProperty(o, "a", { value : 37, writable : false });console.log(o.a); // 打印 37o.a = 25; // 沒(méi)有錯(cuò)誤拋出(在嚴(yán)格模式下會(huì)拋出,即使之前已經(jīng)有相同的值)console.log(o.a); // 打印 37, 賦值不起作用。一般的setter 和 getters
新聞熱點(diǎn)
疑難解答
圖片精選