当前位置:首页 > JavaScript

js实现defineProperty

2026-02-01 08:54:32JavaScript

使用 Object.defineProperty 实现属性定义

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

基本语法

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

描述符的配置选项

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

js实现defineProperty

  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中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…

js实现轮播代码

js实现轮播代码

基础轮播实现 使用HTML、CSS和JavaScript创建一个简单的轮播效果。HTML部分定义轮播容器和图片元素。 <div class="carousel"> <div c…

js实现上传图片

js实现上传图片

使用HTML5的File API实现图片上传 HTML5的File API允许通过JavaScript访问用户选择的文件。需要创建一个文件输入元素,并监听其change事件。 <input t…