js属性类型及其特性操作方法

  1 // js中有两种属性:数据属性和访问器属性; 
  2 /**
  3  * 1.【数据属性】的4个特性:
  4  * [[Configurable]]: 可配置性;
  5  * 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性;
  6  * 直接在对象上定义的属性,这个特性值默认为true。
  7  * 
  8  * [[Enumerable]]: 可枚举性;
  9  * 表示能否通过for-in循环返回属性;
 10  * 直接在对象上定义的属性,这个特性值默认为true。
 11  * 
 12  * [[Writable]]: 可写性;
 13  * 表示能否修改属性的值;
 14  * 直接在对象上定义的属性,这个特性值默认为true。
 15  * 
 16  * [[Value]]: 属性的数据值;
 17  * 表示当前属性的值,读写属性值的时候,都是从这个位置读写;
 18  * 这个特性值默认为undefined。
 19  * 
 20  * eg:
 21  * 修改数据属性的默认特性,使用Object.defineProperty(obj, 'propName', descriptors)方法;
 22  * obj:属性所在的对象;
 23  * propName:属性名称;
 24  * descriptors:描述对象(包括4个可配置项,configurable,enumerable,writable,value);
 25  * eg:
 26  */
 27 let info = {
 28     name: 'world'
 29 };
 30 Object.defineProperty(info, 'name', {
 31     configurable: true, // 是否可配置,默认为true;
 32     enumerable: true, // 是否可以被for-in遍历,默认为true;
 33     writable: true, // 是否可执行写入操作,默认为true;
 34     value: 'hello' // 属性的值,默认为undefined
 35 });
 36 // 使用 Object.defineProperties() 方法配置修改多个属性;
 37 
 38 /**
 39  * 2.【访问器属性】的4个特性:
 40  * 注意:访问器属性不能直接定义,必须通过Object.defineProperty()方法来定义。
 41  * [[Configurable]]: 可配置性;同数据属性。
 42  * 
 43  * [[Enumerable]]: 可枚举性;同数据属性。
 44  * 
 45  * [[Get]]: 在读取属性时调用的函数,默认值为undefined。
 46  * 
 47  * [[Set]]: 在写入属性时调用的函数,默认值为undefined。
 48  * 
 49  * eg:
 50  * 使用Object.defineProperty(obj, 'propName', descriptors)方法定义;
 51  * obj:属性所在的对象;
 52  * propName:属性名称;
 53  * descriptors:描述对象(包括4个可配置项,configurable,enumerable,get,set);
 54  * eg:
 55  */
 56 let book = {
 57     _year: 2004,
 58     edition: 1
 59 };
 60 Object.defineProperty(book, 'year', {
 61     configurable: true, // 是否可配置,默认为true;
 62     enumerable: true, // 是否可以被for-in遍历,默认为true;
 63     get: function () {
 64         return this._year;
 65     },
 66     set: function (newVal) {
 67         if (newVal > 2004) {
 68             this._year = newVal;
 69             this.edition += newVal - 2004;
 70         }
 71     }
 72 });
 73 book.year = 2008;
 74 console.log('book.edition+++++', book.edition); // book.edition+++++ 5
 75 // 使用 Object.defineProperties() 方法配置修改多个属性;
 76 
 77 // 3.定义多个属性【Object.defineProperties()】方法:
 78 let obj = {};
 79 Object.defineProperties(obj, {
 80     name: {
 81         writable: true,
 82         value: 'Jane'
 83     },
 84     age: {
 85         writable: true,
 86         value: 20
 87     },
 88     description: {
 89         get () {
 90             return `${this.name} is ${this.age} years old.`
 91         },
 92         set (val) {
 93             // 不设置值的话可以省略
 94         }
 95     }
 96 })
 97 console.log('obj.description+++++++', obj.description); // obj.description+++++++ Jane is 20 years old.
 98 
 99 // 4.读取属性的特性【Object.getOwnPropertyDescriptor()】方法:
100 let getValue = Object.getOwnPropertyDescriptor(book, 'edition')
101 console.log('getValue+++++', getValue); // getValue+++++ { value: 5, writable: true, enumerable: true, configurable: true }

 

参考资料:《JavaScript高级程序设计》第三版

posted @ 2022-03-17 17:55  CooperGao  阅读(299)  评论(0)    收藏  举报