属性描述符(已完结)

属性描述符

属性描述符(或者说‘数据描述符’)用于描述对象中属性的一些特性——value(即指属性值,没错——属性值也属于属性描述符)、writable、enumerable、configurable(其实属性描述符不止这些,这儿仅说说常见的一些)

当我们创建一个普通属性时,这三个属性描述符都会使用默认值——true

设置属性描述符

设置属性描述符——或者说给对象添加一个新属性或修改已有属性

方法:Object.defineProperty(对象, 属性名, {属性描述符:值,…})

var obj = {
    age : 20
}

obj.age = 30;
console.log(obj.age);//30,由于writable为true,固可写

Object.defineProperty(obj, 'age', {writable:false});

obj.age = 40;
console.log(obj.age);//30,由于writable为false,固不可写

writable

writable决定我们是否可以修改属性的值——如上例那样

在非严格模式下,修改‘writable:false’会静默失败,不报错;在严格模式下TypeError

configurable

configurable决定属性是否可配置

对于不可配置属性——我们不能使用defineProperty修改属性描述符(因此使“configurable:false”是一个单向操作);不可配置属性也不能被delete

var obj = {
    age : 20
}

obj.age = 30;
console.log(obj.age);//30

Object.defineProperty(obj, 'age', {configurable:false});

obj.age = 40;
console.log(obj.age);//40,可见——我们能够更改不可配置属性的值

delete obj.age;
console.log(obj.age);//40,可见——我们不能删除不可配置属性

在非严格模式下,delete‘configurable:false’会静默失败,不报错;在严格模式下TypeError

*要注意有一个小小的例外:即便属性是configurable:false, 我们还是可以
把writable 的状态由true 改为false,但是无法由false 改为true*

enumerable

enumerable控制的是属性是否会出现在对象的属性枚举中(即for-in循环中)。不可枚举属性在for-in中不能遍历出来,但是我们依然能够正常的通过属性访问表达式进行读取

var obj = {
    age : 20,
    name : '德洛丽丝'
}

Object.defineProperty(obj, 'name', {enumerable:false});

for(pro in obj){
    console.log(pro);
}
//仅输出age,可见name不能被枚举

你可能感兴趣的:(JS)