javascript - 关于defineProperty的value
问题描述
> var a = {}> Object.defineProperty(a, 'b', {... value: 110}){}> a{}> a.b110> a.b = 555555> a.b110> var aa = {b: 1}undefined> Object.defineProperty(aa, 'b', {... value: 119}){ b: 119 }> aa.b119> aa.b = 11> aa.b1
为什么aa.b可更改,a.b不能?
问题解答
回答1:属性描述符有三个属性分别是 configurable enumerable writable,默认值均为 false而使用对象字面量定义的属性描述符均为 true,可以通过 Object.getOwnPropertyDescriptor(a, ’b’) 及 Object.getOwnPropertyDescriptor(aa, ’b’) 来获取两个属性的描述符。
所以 a.b 不可修改,aa.b 可以修改。
回答2:因为默认情况下,通过Object.defineProperty()定义的属性的属性值均为false是不可写的.
a = {}Object.getOwnPropertyDescriptor(a, ’b’)// > undefinedObject.defineProperty(a, 'b', {value: 119})Object.getOwnPropertyDescriptor(a, ’b’)// > Object {value: 119, writable: false, enumerable: false, configurable: false}
而通过对象字面量定义的属性默认是可写的,调用`
aa = { b: 1 }Object.getOwnPropertyDescriptor(aa, ’b’)// > Object {value: 1, writable: true, enumerable: true, configurable: true}
所以aa的b属性是可写的. 所以Object.defineProperty()并不改变属性的属性值.所以aa的b的值会改变.
相关文章:
1. mysql - sql 语句更改表结构,添加多个列,怎么写?2. javascript - vue中父组件向子组件传递Object时,如何避免TypeError?3. angular.js - 在移动端web上如何解决输入法挡住文本框问题?4. javascript - 怎么设计项目的返回码,让不同的返回码代表不同的含义?5. javascript - svg小白,想要在svg里面插入图片6. android-studio - Android Studio 2.2 beta2 更新后强制将 Gradle 版本升级为 2.14.1,有没有遇到同样情况的?7. python - 关于django 模板中循环列表8. css3 怎么实现锯齿状的剪纸效果(如图)9. html5 - 如何利用Canvas技术制作出上下跳动的音乐谱10. mac连接阿里云docker集群,已经卡了2天了,求问?