js中Object.defineProperty()方法的不详解

  

菜菜:“老大,那个,Object.defineProperty是什么鬼?”
  

  

假设我们有个对象用户;我们要给它增加一个属性的名字,我们会这么做

        var用户={};   user.name="狂奔的蜗牛”;   console.log(用户);//{名称:“狂奔的蜗牛”}      

如果想要增加一个sayHi方法叻?

        用户。sayHi=function(){控制台。日志(“嗨!”)};   console.log(用户);//{名称:“狂奔的蜗牛”,sayHi: & # 402; n}      

<代码> Object.defineProperty>   


  

  

Object.defineProperty需要三个参数(对象、propName描述符)

  

1对象对象=比;给谁加
  2 propName属性名=比;要加的属性的名字【类型:字符串】
  3描述符属性描述=比;加的这个属性有什么样的特性【类型:对象】
  

  

那么<代码>描述符这个是个对象,他有那些属性呢& # 63;别着急我们一个一个说,
  

  

既然可以给一个对象增加属性,那么我们用它来做一下给用户添加名字属性,代码是这样的

        var用户={};   Object.defineProperty(用户、“name”{   价值:“狂奔的蜗牛”   })   console.log(用户);//{名称:“狂奔的蜗牛”}      

说明是的还是那个经典的价值<代码> 属性,他就是设置属性值的。
  

  

等等,属性值只能为字符串吗?我们的布尔函数对象数量等呢?

        var用户={};   Object.defineProperty(用户、“name”{   价值:“狂奔的蜗牛”   })   Object.defineProperty(用户、“isSlow”{   值:true   })   Object.defineProperty(用户、“sayHi”{   价值:函数(){控制台。日志("你好! ")}   })   Object.defineProperty(用户、“年龄”{   值:12   })   Object.defineProperty(用户、“出生”{   价值:{   日期:“2018-06-29”,   小时:“下午15:30”   }   })    console.log(用户);      

 js中Object.defineProperty()方法的不详解

  

说明事实证明任何类型的数据都是可以的哦~

  

问题又来了,如果用户对象已经有了名字属性,我们可以通过Object.defineProperty改变这个值吗?
  

  

我们来试试

        var用户={};   Object.defineProperty(用户、“name”{   价值:“狂奔的蜗牛”   })   console.log(用户);   user.name="新=祝辞狂奔的蜗牛”   console.log(用户);   之前      

咦? ?为什么我改了没作用勒? ?
  

  

原因:上边说了描述符有很多属性,除属了价值性还有个可写【顾名思义属性是否可以被重新赋值】接受数据类型为布尔(默认为false)真正=比;支持被重新赋值错误=祝辞只读

  

哦哦,原来如果我没设置可写值的时候就默认只读啊,所以才改不掉

  

那我们看看,设置为正确的,是不是就可以改掉了。

        var用户={};   Object.defineProperty(用户、“name”{   价值:“狂奔的蜗牛”,   可写:真   })   console.log(用户);   user.name="新=祝辞狂奔的蜗牛”   console.log(用户);   之前      

 js中Object.defineProperty()方法的不详解“> <br/>
  </p>
  <p>这个描述符还有其他的属性吗?可列举的【顾名思义属性是否可以被枚举】接受数据类型为布尔(默认为false)真正=比;支持被枚举假=祝辞;不支持</p>
  <p>额…枚举? ?什....什么意思? </p>
  <p>假设我们想知道这个用户对象有哪些属性我们一般会这么做</p>
  
  <pre类=   var用户={   名称:“狂奔的蜗牛”,   年龄:25   };//es6   var关键字=种(用户)   console.log(钥匙);//(“名字”,“年龄”)//es5   var关键字=[];   (关键用户){   keys.push(关键);   }   console.log(钥匙);//(“名字”,“年龄”)      之前      

如果我们使用对象。的方式定义属性会发生什么呢?我们来看下输出

        var用户={   名称:“狂奔的蜗牛”,   年龄:25   };//定义一个性别可以被枚举   Object.defineProperty(用户、“性别”{   价值:“男”,   可列举的:真   })//定义一个出生日期不可以被枚举   Object.defineProperty(用户、“出生”{   价值:“1956-05-03”,   可列举的:假   })//es6   var关键字=种(用户)   console.log(键);//(“名字”、“年龄”、“性别”)      console.log(用户);//{名称:“狂奔的蜗牛”,年龄:25岁,性别:“男”,出生:“1956-05-03”}   console.log (user.birth);//1956-05-03      

js中Object.defineProperty()方法的不详解