当前位置:首页 > JavaScript

js实现defineProperty

2026-02-01 08:54:32JavaScript

js实现defineProperty

使用 Object.defineProperty 实现属性定义

Object.defineProperty 是 JavaScript 中用于直接在对象上定义新属性或修改现有属性的方法。它允许精确控制属性的行为(如可枚举性、可配置性、可写性)以及定义 getter 和 setter。

js实现defineProperty

基本语法

Object.defineProperty(obj, prop, descriptor)
  • obj:目标对象。
  • prop:要定义或修改的属性名称或 Symbol。
  • descriptor:属性的描述符对象。

描述符的配置选项

属性描述符分为两种类型:

  1. 数据描述符:包含 valuewritable
  2. 存取描述符:包含 getset

通用选项(两种描述符均可使用)

  • configurable:默认为 false。若为 true,则该属性的描述符可被修改,且属性可从对象中删除。
  • enumerable:默认为 false。若为 true,则该属性会出现在对象的枚举属性中(如 for...in 循环)。

数据描述符专用选项

  • value:属性的值,默认为 undefined
  • writable:默认为 false。若为 true,则属性的值可以被赋值运算符修改。

存取描述符专用选项

  • get:属性的 getter 函数,默认为 undefined。读取属性时调用。
  • set:属性的 setter 函数,默认为 undefined。写入属性时调用。

示例代码

定义普通属性

const obj = {};
Object.defineProperty(obj, 'name', {
  value: 'John',
  writable: true,
  enumerable: true,
  configurable: true
});
console.log(obj.name); // 输出: John

定义 getter 和 setter

const user = {};
let _age = 0;

Object.defineProperty(user, 'age', {
  get() {
    return _age;
  },
  set(newValue) {
    if (newValue >= 0) {
      _age = newValue;
    } else {
      console.error('Age cannot be negative');
    }
  },
  enumerable: true,
  configurable: true
});

user.age = 25;
console.log(user.age); // 输出: 25
user.age = -1; // 输出: Age cannot be negative

定义不可枚举属性

const obj = {};
Object.defineProperty(obj, 'hiddenProp', {
  value: 'secret',
  enumerable: false
});

console.log(obj.hiddenProp); // 输出: secret
console.log(Object.keys(obj)); // 输出: [](不可枚举)

注意事项

  • 若同时指定 value/writableget/set,会抛出异常。
  • 修改 configurable: false 的属性会静默失败(严格模式下报错)。
  • Object.defineProperty 是 Vue 2 响应式系统的核心实现方式之一。

兼容性

  • 支持所有现代浏览器和 Node.js。
  • 在 IE8 及以下版本中仅能用于 DOM 对象。

分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callback) {…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…