Object.defineProperty的使用(实现myConst)

135 阅读2分钟

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特性表示对象的属性是否可以被删除,以及除valuewritable特性外的其他特性是否可以被修改。(当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
});

由于writableconfigurable默认都为false,所以可以定义为

var myConst = {};
Object.defineProperty(myConst, "A", {
	value: 1,
    enumerable: true
});