深入解析JavaScript 中的 Object.defineProperty() 与 Object.defineProperties() 方法

前言

写在前面,基本的功能与差异如下:

  • Object.defineProperty()
    定义单个属性,接受三个参数(对象、属性名、描述符)

  • Object.defineProperties()
    定义多个属性,接受两个参数(对象、包含多个描述符的对象)

1. Object.defineProperty()

Object.defineProperty() 是一个用于定义对象属性的静态方法,允许你精确地添加或修改对象的属性,包括它们的特性,如可写性、可枚举性和可配置性

基本的语法如下:

Object.defineProperty(obj, prop, descriptor)

属性如下:

  • obj:要在其上定义属性的对象
  • prop:要定义或修改的属性的名称
  • descriptor:描述符对象,定义属性的特性

对于表述的对象有很多种用法,具体如下:

属性 描述
value 属性的值(默认为 undefined)
writable 如果设置为 true,则属性值可以被修改;默认为 false
enumerable 如果设置为 true,则属性会出现在对象的枚举属性中;默认为 false
configurable 如果设置为 true,则可以删除属性或修改其特性;默认为 false

Demo如下:

// 创建一个对象
const person = {
    
    };

// 使用 Object.defineProperty() 添加一个属性
Object.defineProperty(person, 'name', {
    
    
    value: '码农研究僧',         // 属性值
    writable: true,         // 允许修改
    enumerable: true,       // 可以被枚举
    configurable: true      // 可以被删除或修改特性
});

// 输出对象属性
console.log(person.name); // 码农研究僧

// 修改属性值
person.name = '码农';
console.log(person.name); // 码农

// 删除属性
delete person.name;
console.log(person.name); // undefined

// 试图修改一个不可写的属性
Object.defineProperty(person, 'age', {
    
    
    value: 30,
    writable: false,        // 不可修改
});

// 尝试修改不可写的属性
person.age = 25;          // 失败,age 仍然是 30
console.log(person.age);  // 30

截图如下:

在这里插入图片描述

2. Object.defineProperties()

Object.defineProperties() 方法与 Object.defineProperty() 类似,但它允许一次性定义多个属性

基本语法如下:

Object.defineProperties(obj, props)
  • obj: 要在其上定义属性的对象
  • props:一个对象,其中每个属性对应于要定义的属性的描述符

Demo如下

// 创建一个对象
const car = {
    
    };

// 使用 Object.defineProperties() 添加多个属性
Object.defineProperties(car, {
    
    
    make: {
    
    
        value: '码农',
        writable: true,
        enumerable: true,
        configurable: true
    },
    model: {
    
    
        value: '研究僧',
        writable: false, // 不可修改
        enumerable: true,
        configurable: false // 不可删除
    },
    year: {
    
    
        value: 2020,
        writable: true,
        enumerable: true,
        configurable: true
    }
});

// 输出对象属性
console.log(car.make); // 码农
console.log(car.model); // 研究僧
console.log(car.year); // 2020

// 修改属性值
car.make = '测试1';
console.log(car.make); // 测试1

// 尝试修改不可写的属性
car.model = '测试2'; // 失败
console.log(car.model); // 研究僧

// 尝试删除不可配置的属性
delete car.model; // 失败
console.log(car.model); // 研究僧

截图如下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_47872288/article/details/143272815