目录
- 前言
- 1. Object.defineProperty()
- 2. 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); // 研究僧
截图如下: