当前位置:首页 > JavaScript

js实现defineProperty

2026-03-14 07:28:08JavaScript

实现 defineProperty 的基本方法

在 JavaScript 中,Object.defineProperty() 方法用于直接在对象上定义新属性,或修改现有属性,并返回该对象。该方法接受三个参数:目标对象、属性名称和属性描述符。

const obj = {};

Object.defineProperty(obj, 'propertyName', {
  value: 42,
  writable: false,
  enumerable: true,
  configurable: true
});

console.log(obj.propertyName); // 42
obj.propertyName = 100; // 静默失败,严格模式下会抛出错误
console.log(obj.propertyName); // 42

属性描述符的配置选项

属性描述符分为数据描述符和存取描述符,两者不能混合使用。数据描述符包含 valuewritable,而存取描述符包含 getset

js实现defineProperty

数据描述符示例:

js实现defineProperty

Object.defineProperty(obj, 'dataProp', {
  value: 'hello',
  writable: true,   // 是否可修改
  enumerable: true, // 是否可枚举(如出现在 for...in 循环中)
  configurable: true // 是否可删除或修改属性描述符
});

存取描述符示例:

let internalValue = 0;
Object.defineProperty(obj, 'accessorProp', {
  get() {
    return internalValue;
  },
  set(newValue) {
    internalValue = newValue * 2;
  },
  enumerable: true,
  configurable: true
});

obj.accessorProp = 10;
console.log(obj.accessorProp); // 20

批量定义属性

使用 Object.defineProperties() 可以一次性定义多个属性:

Object.defineProperties(obj, {
  prop1: {
    value: true,
    writable: true
  },
  prop2: {
    value: 'World',
    writable: false
  }
});

注意事项

  • 如果 configurablefalse,则不能更改除 writablevalue 之外的属性描述符特性。
  • 在严格模式下,尝试修改不可写属性或删除不可配置属性会抛出错误。
  • 使用 getset 时,不能同时指定 valuewritable

分享给朋友:

相关文章

vue实现js休眠

vue实现js休眠

Vue 中实现 JavaScript 休眠 在 Vue 中实现 JavaScript 休眠通常需要使用异步方式,以避免阻塞主线程。以下是几种常见方法: 使用 setTimeout 和 Promise…

js实现乘

js实现乘

JavaScript 实现乘法运算 在 JavaScript 中实现乘法运算可以通过多种方式完成,包括基本运算符、函数封装以及高级算法(如大数乘法)。以下是几种常见方法: 使用基本乘法运算符 Jav…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…