理解对象
ES5中的对象是指无序的属性的集合。(属性可以是基本值、对象和函数)。
对象的属性类型有两种,一种是数据属性,是数据值的保存位置;另一种是访问器属性,包含getter和setter函数。
1.1 数据属性
数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有四个描述其特征的特性。(这些特性是为javascript内部引擎服务的,不能直接访问,所以将它们放在方括号中。)
- [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。默认值为true。
- [[Enumerable]]: 能否通过for-in循环返回属性。默认值为true。
- [[Writable]]:能否修改属性的值,默认值为true。
- [[Value]]: 属性的数据值,默认为undefined。
!!!此处说的默认值是指直接定义时的默认值,与使用defineProperty()定义的属性默认值不同
数据属性可以直接使用对象字面量或new Object对象来定义,而这些特性值不能直接访问,要修改默认的特性,要使用定义在Object对象中的defineProperty()函数。
!!!在调用 Object.defineProperty()方法时,如果不指定configurable、enumerable 和writable 特性的默认值都是 false。
示例如下:
// 使用对象字面量创建一个对象
var person = {
};
//修改该对象属性的默认特性
/*
第一个参数为属性所在的对象。
第二个参数为要定义的属性名。
第三个参数是其特性描述符的对象。(属性为configurable, enumerable, writable, value)
*/
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
//这样就可以访问定义好的数据属性了
alert(person.name); //"Nicholas"
//在定义属性时将writable设定为false,所有对name属性的值更改操作无效。(严格模式下会报错)
person