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高级程序设计》第三版

js属性类型及特性操作方法
浙公网安备 33010602011771号