Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解

在如今比較新的框架中, 好比 reactjs, vuejs中用得不少的一個屬性即是vue

Object.defineOPropertyreact

此屬性的文檔在網上一搜, 其中的幾個屬性,框架

包括 存取描述符(有set和get的) 和 數據描述符(直接有 value 的就是數據描述符)spa

有 set get 有 value writable enumerable configurablecode

雖然有 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 控制是否能夠枚舉.

例如一下的例子,解釋了一下 enumerableblog

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, 是沒有具體的值的.
}
相關文章
相關標籤/搜索