ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[`Object.defineProperty(obj, prop, descriptor)`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)给对象添加一个属性并指定该属性的配置。 `obj`要定义属性的对象。 `prop`要定义或修改的属性的名称或[`Symbol`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol)。 `descriptor`要定义或修改的属性描述符 对象里目前存在的属性描述符有两种主要形式:**数据描述符**和**存取描述符**。 **数据描述符**:是一个具有值的属性,该值可以是可写的,也可以是不可写的。 **存取描述符**:是由 getter 函数和 setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者 这两种描述符都是对象。它们共享以下可选键值(默认值是指在使用`Object.defineProperty()`定义属性时的默认值): #### 描述符可拥有的键值 | | configurable=false | enumerable =false | value=undefined | writable=false | get=undefined | set=undefined | | --- | --- |--- | --- |--- | --- |--- | | 数据描述符 | 可以 | 可以 | 可以 | 可以 | 不可以 | 不可以 | | 存取描述符 | 可以 | 可以 | 不可以 | 不可以 | 可以 | 可以 | `configurable` 当且仅当该属性的`configurable`键值为`true`时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 **默认为****`false`**。 `enumerable` 当且仅当该属性的`enumerable`键值为`true`时,该属性才会出现在对象的枚举属性中。**默认为`false`**。 `value` 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 **默认为[`undefined`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/undefined)**。 `writable` 当且仅当该属性的`writable`键值为`true`时,属性的值,也就是上面的`value`,才能被[`赋值运算符`](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Assignment_Operators)改变。 **默认为`false`。** `get` 属性的 getter 函数,如果没有 getter,则为`undefined`。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入`this`对象(由于继承关系,这里的`this`并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。 **默认为`undefined`**。 `set` 属性的 setter 函数,如果没有 setter,则为`undefined`。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的`this`对象。**默认为`undefined`**。 ``` const object1 = {}; Object.defineProperty(object1, 'property1', { value: 42, writable: false }); object1.property1 = 77; // throws an error in strict mode console.log(object1.property1); // expected output: 42 ```