参考文档:Object.defineProperty
一,语法
1
| Object.defineProperty(obj, prop, desc)
|
| 参数 |
说明 |
| obj |
需要定义属性的当前对象 |
| prop |
当前需要定义的属性名 |
| desc |
属性描述符 |
二,示例
1 2 3 4 5 6 7 8 9 10
| let obj = {}; Object.defineProperty(obj, 'a', { value : 20, writable : true, enumerable : true, configurable : true, get() {}, set() {} }); console.log(obj.a); // 20
|
| 参数 |
说明 |
| value |
属性的初始化值 |
| writeble |
是否可修改值的内容 |
| enumerable |
是否可枚举,默认为false |
| configurable |
是否可删除,默认为false |
| get |
在读取属性时调用的函数,默认值为undefined |
| set |
在写入属性时调用的函数,默认值为undefined |
三,writeble 属性
当writable属性设置为false时,该属性被称为“不可写”。它不能被重新分配。
默认为 false,如下:
1 2 3 4 5 6 7
| let obj = {}; obj.a = 10; console.log(obj.a); // 10 Object.defineProperty(obj, 'b', {}); console.log(obj.b); // undefined obj.b = 20 console.log(obj.b) // undefined
|
设置为 true,如下:
1 2 3 4 5 6 7
| let obj = {}; obj.a = 10; console.log(obj.a) // 10 Object.defineProperty(obj, 'b', { writable: true }); console.log(obj.b) // undefined obj.b = 20 console.log(obj.b) // 20
|
四,enumerable 属性
默认为 false
enumerable 定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| let obj = {}; Object.defineProperty(obj, 'a', { enumerable: false }); Object.defineProperty(obj, 'b', { enumerable: true }); Object.defineProperty(obj, 'c', {}); obj.d = null; // 直接赋值时, enumerable 为 true
// ------ for...in ------ let arr = []; for (let i in obj) { arr.push(i); } console.log(arr); // ["b", "d"]
// ------ Object.keys() ------ let keys = Object.keys(obj); console.log(keys); // ["b", "d"]
|
五,configurable 属性
configurable 特性表示对象的属性是否可以被删除,以及除value和writable特性外的其他特性是否可以被修改。
默认为 false,如下:
1 2 3 4 5 6 7 8 9 10
| let obj = {}; Object.defineProperty(obj, 'a', { configurable: false, get() { return 123; } }); console.log(obj.a); // 123 delete obj.a; console.log(obj.a); // 123
|
设置为 true,如下:
1 2 3 4 5 6 7 8 9 10
| let obj = {}; Object.defineProperty(obj, 'a', { configurable: true, get() { return 123; } }); console.log(obj.a); // 123 delete obj.a; console.log(obj.a); // undefined
|
六,一般的 Setters 和 Getters
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| function fn (args) { Object.defineProperty(this, 'myproperty', { get() { return args; }, set(res) { this.val = res; } }) } let _fn = new fn('get'); let myproperty = _fn.myproperty; console.log(myproperty); // get _fn.myproperty = 'set'; let val = _fn.val; console.log(val); // set
|
七,添加多个属性和默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| let obj = {}; obj.a = 1; // 等同于 Object.defineProperty(obj, 'a', { value: 1, writable: true, enumerable: true, configurable: true });
Object.defineProperty(obj, 'b', { value: 2 }); // 等同于 Object.defineProperty(obj, 'a', { value: 1, writable: false, enumerable: false, configurable: false });
|