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, 是没有具体的值的.
}
相关文章
相关标签/搜索