除了传统的定义对象属性的方式外,JS 中还提供了 Object.defineProperty()方法来定义对象的属性。

一、基础语法

  1. Object.defineProperty(对象, '键名', {
  2. // ... 四个属性,两个方法
  3. })

二、四个属性

通过 Object.defineProperty() 方法定义的属性,默认情况下不能修改、不能删除、不能遍历。

1、value

value用来设置当前键所对应的值。

  1. const student = {};
  2. Object.defineProperty(对象, 'name', {
  3. value: '张三'
  4. })
  5. student.name = '李四';
  6. delete student.name;
  7. for(const key in student) {
  8. console.log(key);
  9. }

2、writable

writable 可以用来设置是否可修改,默认 false。

  1. const student = {};
  2. Object.defineProperty(对象, 'name', {
  3. value: '张三',
  4. writable: true, // 可修改
  5. })
  6. student.name = '李四';

3、configurable

configurable,可以用来设置是否可删除,默认 false。

  1. const student = {};
  2. Object.defineProperty(对象, 'name', {
  3. value: '张三',
  4. configurable: true, // 可删除
  5. })
  6. delete student.name;

4、enumerable

enumerable,可以用来设置是否可遍历,默认 false。

  1. const student = {};
  2. Object.defineProperty(对象, 'name', {
  3. value: '张三',
  4. enumerable: true, // 可遍历
  5. })
  6. for(const key in student) {
  7. console.log(key);
  8. }

三、两个方法

1、get

当我们访问指定的键时,会触发对应的 get 方法。同时,get 方法的返回值会作为当前键对应的属性值。

  1. const student = {
  2. name: '张三'
  3. };
  4. const value = student.name;
  5. Object.defineProperty(对象, 'name', {
  6. get() {
  7. return value;
  8. }
  9. })

2、set

当我们修改指定的键时,会触发对应的 set 方法。同时,set 方法可以通过参数来接收到用户想要修改的新值。

  1. const student = {
  2. name: '张三'
  3. };
  4. const value = student.name;
  5. Object.defineProperty(对象, 'name', {
  6. get() {
  7. return value;
  8. },
  9. set(newValue) {
  10. value = newValue;
  11. }
  12. })