diff --git a/16. 属性描述符/属性描述符.md b/16. 属性描述符/属性描述符.md index d8a3f01..5b7db76 100644 --- a/16. 属性描述符/属性描述符.md +++ b/16. 属性描述符/属性描述符.md @@ -4,47 +4,35 @@ ## 经典真题 - - - *JavaScript* 中对象的属性描述符有哪些?分别有什么作用? ## 属性描述符详解 - - 在 *JavaScript* 中,对象的属性可以分为两种: - - - 数据属性:它的本质就是一个数据 - 存取器属性:它的本质是一个函数,但是可以将它当作普通属性来使用,当给该属性赋值时,会运行相应的 *setter* 函数,当获取该属性的值时,会运行相应的 *getter* 函数。除了存取器,还有一些其他的关键字,用以表示当前属性是否可写、是否有默认值、是否可枚举等,这些关键字就是属性描述符。 - - 属性描述符是 *ECMAScript* 5 新增的语法,它其实就是一个内部对象,用来描述对象的属性的特性。 ### 属性描述符的结构 - - 在定义对象、定义属性时,我们曾经介绍过属性描述符,属性描述符实际上就是一个对象。 属性描述符一共有 *6* 个,可以选择使用。 - *value*:设置属性值,默认值为 *undefined*。 -- *writable*:设置属性值是否可写,默认值为 *true*。 -- *enumerable*:设置属性是否可枚举,即是否允许使用 *for/in* 语句或 *Object.keys( )* 函数遍历访问,默认为 *true*。 -- *configurable*:设置是否可设置属性特性,默认为 *true*。如果为 *false*,将无法删除该属性,不能够修改属性值,也不能修改属性的属性描述符。 +- *writable*:设置属性值是否可写,默认值为 *false*。 +- *enumerable*:设置属性是否可枚举,即是否允许使用 *for/in* 语句或 *Object.keys( )* 函数遍历访问,默认为 *false*。 +- *configurable*:当设置为 false 时,该属性的类型不能在数据属性和访问器属性之间更改,且该属性不可被删除,且其描述符的其他属性也不能被更改(但是,如果它是一个可写的数据描述符,则 value 可以被更改,writable 可以更改为 false)。默认值为 false。 - *get*:取值函数,默认为 *undefined*。 - *set*:存值函数,默认为 *undefined*。 - - 注意这几个属性不是都可以一起设置,具体如下图: ![image-20211021111647398](https://xiejie-typora.oss-cn-chengdu.aliyuncs.com/2021-10-21-031647.png) @@ -105,8 +93,6 @@ Object.defineProperty(obj, 'x', {configurable: true}); //抛出异常 ### *get* 和 *set* 函数 - - 除了使用点语法或中括号语法访问属性的 *value* 外,还可以使用访问器,包括 *set* 和 *get* 两个函数。 其中,*set( )* 函数可以设置 *value* 属性值,而 *get( )* 函数可以读取 *value* 属性值。 @@ -253,8 +239,6 @@ console.log(obj.y); //2 ### 控制对象状态 - - *JavaScript* 提供了 *3* 种方法,用来精确控制一个对象的读写状态,防止对象被改变。 - *Object.preventExtensions*:阻止为对象添加新的属性。 @@ -293,8 +277,6 @@ console.log(Object.isFrozen(obj3)); //false ## 真题解答 - - - *JavaScript* 中对象的属性描述符有哪些?分别有什么作用? > 参考答案: @@ -302,9 +284,9 @@ console.log(Object.isFrozen(obj3)); //false > 属性描述符一共有 *6* 个,可以选择使用。 > > - *value*:设置属性值,默认值为 *undefined*。 -> - *writable*:设置属性值是否可写,默认值为 *true*。 -> - *enumerable*:设置属性是否可枚举,即是否允许使用 *for/in* 语句或 *Object.keys( )* 函数遍历访问,默认为 *true*。 -> - *configurable*:设置是否可设置属性特性,默认为 *true*。如果为 *false*,将无法删除该属性,不能够修改属性值,也不能修改属性的属性描述符。 +> - *writable*:设置属性值是否可写,默认值为 *false*。 +> - *enumerable*:设置属性是否可枚举,即是否允许使用 *for/in* 语句或 *Object.keys( )* 函数遍历访问,默认为 *false*。 +> - *configurable*:当设置为 false 时,该属性的类型不能在数据属性和访问器属性之间更改,且该属性不可被删除,且其描述符的其他属性也不能被更改(但是,如果它是一个可写的数据描述符,则 value 可以被更改,writable 可以更改为 false)。默认值为 false。 > - *get*:取值函数,默认为 *undefined*。 > - *set*:存值函数,默认为 *undefined*。 >