javascript对象的两种属性描述符
实际上 JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者 Symbol 为 key,以数据属性特征值或者访问器属性特征值为 value。
对象是一个属性的索引结构(索引结构是一类常见的数据结构,我们可以把它理解为一个能够以比较快的速度用 key 来查找 value 的字典)。{writable:true,value:1,configurable:true,enumerable:true}是 value。
为什么有人说“JavaScript 不是面向对象”这样的说法。这是由于 JavaScript 的对象设计跟目前主流基于类的面向对象差异非常大。
可事实上,这样的对象系统设计虽然特别,但是 JavaScript 提供了完全运行时的对象系统,这使得它可以模仿多数面向对象编程范式(JavaScript 中两种面向对象编程的范式:基于类和基于原型),所以它也是正统的面向对象语言。
JavaScript 语言标准也已经明确说明,JavaScript 是一门面向对象的语言,我想标准中能这样说,正是因为 JavaScript 的高度动态性的对象系统。
数据属性描述符
它比较接近于其它语言的属性概念。数据属性具有四个特征。使用getOwnPropertyDescriptor 查看数据属性。
- value:就是属性的值。
- writable:决定属性能否被赋值。
- enumerable:决定 for in 能否枚举出该属性。
- configurable:决定该属性能否被删除或者改变特征值。
// 1.对象字面量默认定义
let obj = {a:'111'}
//上面代码中默认定义了四个数据描述符:value writable enumerable configurable
// 2.自定义数据描述符
Object.defineProperty(
{},'a', {value:'222',writable:false,enumerable:false,configurable:false})
console.log(obj1.a)//111
obj2.a = '333';
console.log(obj2.a)//222