当前位置:首页 > 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

数据描述符示例:

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() 可以一次性定义多个属性:

js实现defineProperty

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

注意事项

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

分享给朋友:

相关文章

js实现乘

js实现乘

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

js实现换肤

js实现换肤

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

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(f…

利用js实现

利用js实现

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

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…