Page 126 - 你不知道的JavaScript(上卷)
P. 126

3.3.5 属性描述符

                 在 ES5 之前,JavaScript 语言本身并没有提供可以直接检测属性特性的方法,比如判断属
                 性是否是只读。

                 但是从 ES5 开始,所有的属性都具备了属性描述符。

                 思考下面的代码:

                     var myObject = {
                         a:2
                     };

                     Object.getOwnPropertyDescriptor( myObject, "a" );
                     // {
                     //    value: 2,
                     //    writable: true,
                     //    enumerable: true,
                     //    configurable: true
                     // }

                 如你所见,这个普通的对象属性对应的属性描述符(也被称为“数据描述符”,因为它
                 只保存一个数据值)可不仅仅只是一个 2。它还包含另外三个特性:writable(可写)、
                 enumerable(可枚举)和 configurable(可配置)。
                 在创建普通属性时属性描述符会使用默认值,我们也可以使用 Object.defineProperty(..)
                 来添加一个新属性或者修改一个已有属性(如果它是 configurable)并对特性进行设置。

                 举例来说:

                     var myObject = {};

                     Object.defineProperty( myObject, "a", {
                         value: 2,
                         writable: true,
                         configurable: true,
                         enumerable: true
                     } );

                     myObject.a; // 2

                 我们使用 defineProperty(..) 给 myObject 添加了一个普通的属性并显式指定了一些特性。
                 然而,一般来说你不会使用这种方式,除非你想修改属性描述符。

                 1. Writable
                 writable 决定是否可以修改属性的值。

                 思考下面的代码:


                                                                                 对象   |   111
   121   122   123   124   125   126   127   128   129   130   131