定义一个对象 object, 然后获取 object 的 x 属性值来做一些事情. 例如打印.
我们创建对象每一个属性都有 property attribute 描述这个属性, 这些属性我们在用 Object.defineProperty 定义一个对象属性已经用到过. ECMAScript 规范基本上将所有对象定义为由字符串键值映射到 property 属性 的字典.
1. value 任意数据类型对象属性的默认值, 默认值为 undefined
2. writable 为布尔型, 对象属性是否可修改, flase 为不可修改, 默认值为 true.
3. enumerable 为布尔型, 对象属性是否可通过 for-in 循环, flase 为不可循环, 默认值为 true
4. configurable 也是布尔型, 能否使用 delete, 能否需改属性特性, 或能否修改访问器属性,,false 为不可重新定义, 默认值为 true.
以上就是我们创建一个对象时, JavaScript 引擎所做的事.
我们知道在 JavaScript 语言, 几乎所有集合类型都用数组来实现, 我们可以用数组实现 map,hashmap,set 等. 当然现在 es6 中我们不用再自己造轮子. es6 为我们提供除了数组意外更多集合选择.
其实集合本质, 在 JavaScript 引擎中也是以对象形式保存在内存中的. 多了一个 length 属性, 他是数组特有的一个属性, 包括数组的长度. 大家可以注意一下他属性值. 其他就是键对象.
每当我们为数组新增一个元素时, 这里添加属性到这个数组对象, 键为 1 值为图中所示, 然后自增一下 length.
我们在定义一个对象时, 由于在 JavaScript 基本上算是没有类的概念, 即使在 es6 新增 class 或是在 typescript 都为我们准备好类个关键字供我们使用, 不过他还是基于 function, 而不是真正意义上的 class. 也没有必要.
既然没有 class 的概念, 所以我们用 object 来直接定义数据结构. 不同对象具有相同数据结构, 我们就可以将他们看成一类, 或者是同一类的数据结构.
我们一定对象, 上面已经介绍了 object 在 JavaScript 引擎中是如何创建的.
当我们创建了一个 object 在 JavaScript 将他结构用 shape 来表示, 这样 shape 是可以复用, 当我们创建一个具有相同数据结构的 object 就可以复用这个 shape ,object 无需考虑结构, 和属性的定义, 只是持有 object 对应属性的值就可以, 这样可以减少内存开销.
当我们再次创建一个具有相同数据结构, 有就是具有相同 shape 的对象时, 我们可以共享 shape , 如下图
来源: http://www.jianshu.com/p/8f2dc0fb3bbb