面向对象的属性分为两种:
数据属性
- Configurable 表示能否通过 delete 删除属性从而重新定义属性,默认值为true。
- Enumerable 表示能否通过 for-in 循环返回属性,默认值为true。
- Writable 表示能否修改属性的值,默认值为true。
- Value 包含这个属性的数据值。
数据属性使用Object.defineProperty
方法进行重写,如果没有重写则为默认值。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13
| var girl = { name: 'Lily' }
Object.defineProperty(girl, "name", { configurable: false, writable: false, });
girl.name = '321'; delete girl.name;
console.log(girl);
|
访问器属性
- Configurable 表示能否通过 delete 删除属性从而重新定义属性,默认值为true。
- Enumerable 表示能否通过 for-in 循环返回属性,默认值为true。
- get 在读取属性时调用的函数,默认值为 undefined。
- set 在写入属性时调用的函数,默认值为 undefined。
访问器属性使用Object.defineProperty
方法进行重写,如果没有重写则为默认值。
这里有个小坑:
一开始我是以为 age 定义了get和set方法后可以直接对this.age
进行赋值操作,可是报一个堆栈溢出的错,最后看了一遍书发现理解错了。
可以用对象内私有属性来保存这个赋值 this._age = value
,当然命名都是age是为了好记。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var testObj = { var girl = { name: 'Lily', age: 0 }
Object.defineProperty(girl, "age", { configurable: false, get: function () { return this._age; }, set: function (value) { if (value <= 18) { this._age = value; } else { this._age = 18; } } });
girl.age = 40; console.log(girl.age);
|
定义多个属性
Object.defineProperty
是定义单个属性,定义多个属性用Object.defineProperties
;
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| var girl = { name: 'Lily', age: 0 }
Object.defineProperties(girl, { name: { configurable: false, }, age: { configurable: false, get: function () { return this._age; }, set: function (value) { if (value <= 18) { this._age = value; } else { this._age = 18; } } } });
delete girl.name; girl.age = 40;
console.log(girl.name); console.log(girl.age);
|
读取属性
使用Object.getOwnPropertyDescriptor
方法。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| var girl = { name: 'Lily', age: 0 }
Object.defineProperties(girl, { name: { configurable: false, }, age: { configurable: false, get: function () { return this._age; }, set: function (value) { if (value <= 18) { this._age = value; } else { this._age = 18; } } } });
delete girl.name; girl.age = 40;
console.log(girl.name); console.log(girl.age);
var name = Object.getOwnPropertyDescriptor(girl, "name"); console.log(name.value); console.log(name.configurable);
|