被对象包裹的对象定义属性须知

即对被对象包裹的对象调用Object.defineProperty(obj, 'prop', {})时,最后一个属性描述对象参数需要写明value、enumerable、writable、configurable各属性的值,如果只写了value的值,那么此时余下属性全部默认为false。

什么是被对象包裹的对象?打个比方,比如{a:{}},此时a属性的键值{}就是被对象包裹的对象,此时调用Object.defineProperty(obj.a, 'b', {value:1}),obj.a.b就会无法遍历,不可写,不可配置。数组作为特殊版本的对象,如果你的对数组使用上述方法的时候,也需要注意这个问题。

常规情况都是不会发生这个问题的,比如赋值操作,出入栈队都不会涉及到属性描述对象,但是只要用了上述的方法,就一定要记得把属性描述对象全部写完,不要只写一个value,不然排查问题会带来麻烦。

当属性无法遍历的时候,JSON.stringfy会直接忽略这个属性,因此使用微信小程序缓存也会无法保存这个属性,所以在遇到这种特殊情况的时候,一定要注意。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注