在現在比較新的框架中, 比如 reactjs, vuejs中用得很多的一個屬性便是
Object.defineOProperty
此屬性的文檔在網上一搜, 其中的幾個屬性,
包括 存取描述符(有set和get的) 和 數據描述符(直接有 value 的就是數據描述符)
有 set get 有 value writable enumerable configurable
雖然有 set 和 get, 但是定義的時候還是要用到
enumerable 和 configurable
set 和 get 類似 writable 和 value
其中的 configurable 和 writable 比較讓人混淆。
configurable 給的說明是 如果為 false , 那么不可以修改, 不可以刪除. 但 writable 給的說明是如果設置為 false, 不可以采用 數據運算符 進行賦值
所以這里就有一部分交叉. 如果 writable 為 true 的時候, configurable 為 false ,
那結果會怎么樣呢?
寫一下具體的例子, 比如
var o = {}; // 創建一個新對象 Object.defineProperty(o, "a", { value : "original", writable : false, // 這個地方為 false enumerable : true, configurable : true }); o.a = "new"; //此時候, 是更改不了 a 的. var o = {}; // 創建一個新對象 Object.defineProperty(o, "a", { value : "original", writable : true, enumerable : true, configurable : false //這里為false }); o.a = "new";//此時候, a 進行了改變 //但是如果 delete o.a //將返回 false, 並且 a 沒有被刪除
//結論 此刻我們看來, 對於我們的影響, 目前來看, 主要是 configurable 控制是否可以刪除 writable 控制是否可以修改(賦值) 當然 enumerable 控制是否可以枚舉.
例如一下的例子,解釋了一下 enumerable
var o = {}; // 創建一個新對象 Object.defineProperty(o, "a", { value : 37, writable : true, enumerable : false,//此處設置為false, 在枚舉的時候會忽略 configurable : true }); for(var i in o){ console.log(o[i]); // undefined, 是沒有具體的值的. }