Appearance
数据属性
本节目标:理解“数据属性”的核心思路,并能把它用于实际开发或面试表达。 数据属性包含了一个数据值的位置。在这个位置可以读取和写入值。
用4个特性来描述其行为(attribute)。 [[Configurable]]:表示
属性能不能删:能否通过
delete删除属性,从而重新定义属性;- 定义为
false时,表示不能删除对象属性; delete属性,非严格模式操作将被忽略,严格模式下报错。
- 定义为
其他特性能不能改:定义为
false时,- 修改
Configurable和Enumerable特性会报错; writable特性只有在从false改为true会报错,从true改为false则允许;value值可以修改。
- 修改
更改属性类型:能否把属性修改为数据属性
;不可逆:一旦把属性定义为
false,就不能再把它变回可配置了。[[Enumerable]]**:**表示:能否通过
for-in循环返回属性;
[[Writable]]:表示:能否修改属性的值
- 设为
false时,非严格模式下赋值操作将被忽略,严格模式下报错。
[[Value]]**:**包含这个属性的数据值;
只要 writable 和 configurable 有一个为 true,就允许改动。- 读取属性值的时候,从这个位置读;
- 写入属性值的时候,把新值保存在这个位置;
定义属性的两种方式 一、直接在对象上定义:比如通过字面量、点操作符或[]操作符定义,即使属性名来自变量。它们的[Configurable]]、[[Enumerable]、[[Writable]]特性都被设置为true,而[[Value]]被设置为指定的值(不设置为undefined)。
二、Objcet.defineProperty()方法定义或修改属性。 它接收三个参数:
- 属性所在的对象;
- 属性的名字;
- 一个描述符对象。其中描述符
(descriptor)对象的属性必须是:configurable/enumerabel/writable/value。
在调用此方法定义新的属性时,属性的configurable/enumerabel/writable特性默认值都是false,value默认为undefined。 使用var或不使用var****定义全局变量区别
==当使用====var====声明的变量时,在挂靠为====window====的属性后,其====configurable====为== ==false====,即不可删除====delete====,可遍历,可读可写。==
==var== ==a1 = 1;==
==Object====.getOwnPropertyDescriptor(====this====,===='a1'====)========// Object {========// value: 1,========// writable: true,========// enumerable: true,========// configurable: false========// }====而不使用== ==var== ==命令声明变量时(或者使用属性赋值的方式声明变量),====window====上此属性的可配置性为== ==true====。==
==a2 = 1;====//== ==或者写成====window.a2 = 1;==
==Object====.getOwnPropertyDescriptor(====this====,===='a2'====)========// Object {========// value: 1,========// writable: true,========// enumerable: true,========// configurable: true========// }==