JavaScript 属性类型(数据属性 访问器属性)
ECMA-2把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”
严格来说,这就相当于说对象是一组没有特定顺序的值。对象的属性或方法都有一个名字,而每个名字映射到一个值。我们可以把ECMAScript的对象想象成散列表,无非就是一组名值对,其中值可以是数据或函数。(高程三 P139)
[译]JavaScript中对象的属性 《高程三 P139 属性类型》 JavaScript笔记--数据属性和访问器属性
JavaScript中有两种不同类型的属性:命名数据属性(named data properties),命名访问器属性(named accessor properties)以及内部属性(internal properties).
命名数据属性
命名数据属性包含一个数据值的位置。在这个位置可以读取和写入值。
数据属性有四个描述其行为的特性(attribute)
- [[Configurable]] 布尔值,表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。直接在对象上定义的属性,默认为true
- [[Enumerable]] 布尔值,能否通过for-in循环返回属性。
- [[Writable]] 布尔值,表明能否修改属性的值。(即是否是只读的)
- [[Value]] 属性值
命名访问器属性
访问器属性有四个特性:
- [[Configurable]] 布尔值,表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。直接在对象上定义的属性,默认为true
- [[Enumerable]] 布尔值,能否通过for-in循环返回属性。
- [[Get]] 在读取这个属性时调用的函数。 getter函数
- [[Set]] 在为这个属性赋值时调用的函数。 setter函数
内部属性
有一些属性仅仅是为规范所用的,称之为内部属性,因为它们无法通过JavaScript直接访问到,但是它们的确存在,并且影响着程序的表现.内部属性的名称比较特殊,它们都被两个中括号包围着.下面有两个例子:
- 内部属性[[Prototype]]指向了所属对象的原型.该属性的值可以通过Object.getPrototypeOf()函数读取到.该属性的值只能在创建一个新对象的时候通过Object.create()或者__proto__来设置.
- 内部属性[[Extensible]]决定了是否能给所属对象添加新的属性.该属性的值可以通过Object.isExtensible()读取到.还可以通过Object.preventExtensions()将该属性的值设置为false.一旦设置为false,就无法再设置回true了.
特性(attribute)的默认值
如果你不明确的指定某个特性的值,则它们会被赋一个默认值:
[[Value]] undefined
[[Get]] undefined
[[Set]] undefined
[[Writable]] false
[[Enumerable]] false
[[Configurable]] false
属性描述符(Descriptor)
MDN Object.getOwnPropertyDescriptor() JavaScript 属性描述符 Object.getOwnPropertyDescriptors()(阮一峰ES6入门)
The Object.getOwnPropertyDescriptor()
method returns a property descriptor(返回的是一个对象) for an own property (that is, one directly present on an object, not present by dint of being along an object's prototype chain) of a given object.
属性描述符(property descriptor)可以将一个属性的所有特性编码成一个对象并返回.该对象的每个属性都对应着所属属性的一个特性
和属性描述符相关的操作:
1.
Object.defineProperty( )
The
Object.defineProperty()
method defines a new property directly on an object, or modifies an existing property on an object, and returns the object.
2.
Object.defineProperties()
The Object.defineProperties()
method defines new or modifies existing properties directly on an object, returning the object.
除了用Object.defineProperty(...)和Object.defineProperites(...)
来指定属性描述符之外,JavaScriptES5 还提供了几个操作可以用来配置属性描述符。
3. Object.preventExtensions() 和 Object.isExtensible() (阻止属性的扩展)
阻止新的属性被加入到对象
4. Object.seal() 和
Object.isSealed() (封装)
The Object.seal()
method seals an object, preventing new properties from being added to it and marking all existing properties as non-configurable.
5. Object.freeze() 和
Object.isFrozen() (冻结)
The Object.freeze()
method freezes an object: that is, prevents new properties from being added to it; prevents existing properties from being removed; and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object is made effectively immutable.(不变的,不可变的,即对象彻底被锁死) The method returns the object being frozen.