Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
const object1 = {};
Object.defineProperty(object1, 'property1', {
value: 'lucky'
});
console.log(object1.property1);
//lucky
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。
数据描述符:是一个具有值的属性,该值可以是可写的,也可以是不可写的。
存取描述符:是由getter函数和setter函数所描述的属性。
一个描述符只能是这两者其中之一,不能同时是两者。
| 可拥有的键值 | 数据描述符 | 存取描述符 |
|---|---|---|
| configurable (默认为false) | ✔️ | ✔️ |
| enumerable (默认为false) | ✔️ | ✔️ |
| value (默认为undefined) | ✔️ | |
| writable (默认为false) | ✔️ | |
| get (默认为undefined) | ✔️ | |
| set (默认为undefined) | ✔️ |
1.如果一个描述符不具有value、writable、get和set中的任意一个键,那么它将被默认为是一个数据描述符。
2.如果一个描述符同时拥有value、writable和get、set键,则会产生一个异常。
1.主要讲一下configurable
configurable特性表示对象的属性是否可以被删除,以及除value和writable特性外的其他特性是否可以被修改。(当configurable的值为false时候,所有的属性都不可以被删除,value的值可以修改,writable的值也可以修改,但是只能从true改为false,其他特性不能修改)
2.enumerable
当enumerable的值为true时,该属性才会出现在对象的枚举属性中。
3.writable
当writable的值为true时,value才能被赋值运算符改变。
用Object.defineProperty实现一个const
实现一个const,首先想到肯定是将writable设置为false
var myConst = {};
Object.defineProperty(myConst, "A", {
value: 1,
writable: false, //设置属性只读
configurable: true,
enumerable: true
});
console.log(myConst.A); //1
myConst.A = 2;
console.log(myConst.A); //1
但是,修改属性的数据描述符writable来修改value,依然可以对value进行修改,所以需要将configurable设置为false,这样属性就不可配置了。
var myConst = {};
Object.defineProperty(myConst, "A", {
value: 1,
writable: false, //设置属性只读
configurable: false, //改为false
enumerable: true
});
由于writable和configurable默认都为false,所以可以定义为
var myConst = {};
Object.defineProperty(myConst, "A", {
value: 1,
enumerable: true
});