菜菜:“老大,那个,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(用户);
说明事实证明任何类型的数据都是可以的哦~
问题又来了,如果用户对象已经有了名字属性,我们可以通过Object.defineProperty改变这个值吗?
我们来试试
var用户={}; Object.defineProperty(用户、“name”{ 价值:“狂奔的蜗牛” }) console.log(用户); user.name="新=祝辞狂奔的蜗牛” console.log(用户); >之前咦? ?为什么我改了没作用勒? ?
原因:上边说了描述符有很多属性,除属了价值性还有个可写【顾名思义属性是否可以被重新赋值】接受数据类型为布尔(默认为false)真正=比;支持被重新赋值错误=祝辞只读
哦哦,原来如果我没设置可写值的时候就默认只读啊,所以才改不掉
那我们看看,设置为正确的,是不是就可以改掉了。
var用户={}; Object.defineProperty(用户、“name”{ 价值:“狂奔的蜗牛”, 可写:真 }) console.log(用户); user.name="新=祝辞狂奔的蜗牛” console.log(用户); >之前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-03js中Object.defineProperty()方法的不详解