JavaScript中Object.defineProperty详解_javascript技巧

Object.defineProperty用于精确控制对象属性行为,支持数据描述符(value、writable、enumerable、configurable)和访问器描述符(get、set),可定义不可枚举属性或实现数据验证等高级功能。

javascript中object.defineproperty详解_javascript技巧

在JavaScript中,Object.defineProperty 是一个非常重要的方法,用于精确控制对象属性的定义和行为。它允许我们更细粒度地设置属性的可写性、可枚举性、可配置性,甚至可以定义 getter 和 setter。相比简单的赋值方式(如 obj.prop = value),defineProperty 提供了更强的元数据控制能力,尤其在构建类库、框架或需要数据劫持的场景中非常关键。

基本语法

Object.defineProperty(obj, prop, descriptor) 接收三个参数:

obj:要定义属性的对象。 prop:要定义或修改的属性名(字符串或 Symbol)。 descriptor:属性描述符对象,包含该属性的特性。

属性描述符有两种主要形式:数据描述符和访问器描述符。

数据描述符与访问器描述符

数据描述符是一个具有值的属性,可以控制是否可写。它包含以下可选键:

立即学习“Java免费学习笔记(深入)”;

value:属性的值,默认 undefined。 writable:是否可被重新赋值,true 表示可写,false 为只读,默认 false。 enumerable:是否出现在对象的枚举属性中(如 for…in、Object.keys),默认 false。 configurable:是否可被删除,以及是否可修改其描述符(除 writable 外),默认 false。

访问器描述符通过 getter 和 setter 控制属性的读取和赋值行为:

get:获取属性时调用的函数,无参数,返回值作为属性值。 set:设置属性时调用的函数,接收一个参数(新值)。 同样包含 enumerable 和 configurable。

注意:不能同时使用 value/writableget/set,否则会抛出错误。

实际应用示例

以下是几个常见的使用场景:

巧文书 巧文书

巧文书是一款AI写标书、AI写方案的产品。通过自研的先进AI大模型,精准解析招标文件,智能生成投标内容。

巧文书 61 查看详情 巧文书

1. 定义不可枚举的私有属性

const user = {};Object.defineProperty(user, 'id', {  value: 1001,  writable: false,  enumerable: false,  configurable: false});console.log(user.id); // 1001console.log(Object.keys(user)); // [],不可枚举

2. 使用 getter/setter 实现数据验证

const person = {};Object.defineProperty(person, 'age', {  get() {    return this._age;  },  set(value) {    if (typeof value !== 'number' || value < 0) {      throw new Error('年龄必须是正数');    }    this._age = value;  },  enumerable: true,  configurable: true});person.age = 25; // 正常// person.age = -5; // 抛错

3. 创建只读属性

Object.defineProperty(window, 'API_URL', {  value: 'https://api.example.com',  writable: false,  configurable: false});// API_URL 将无法被修改或删除

注意事项与兼容性

该方法在 ES5 中引入,现代浏览器均支持,但在 IE8 及以下版本中仅适用于 DOM 对象,不推荐用于老项目。

使用 defineProperty 时需注意:

默认情况下所有布尔型描述符均为 false,若未显式设置 writable,属性将不可修改。 configurable 为 false 时,无法再用 defineProperty 修改该属性(除非 writable 从 true 改为 false)。 在严格模式下,对不可写属性赋值会抛错;非严格模式则静默失败。

基本上就这些。掌握 Object.defineProperty 能帮助你更好地理解 JavaScript 的属性机制,也为实现响应式系统(如 Vue 2.x)打下基础。虽然现在有 Proxy 可以做更强大的拦截,但在某些兼容性要求或精细控制场景中,defineProperty 依然不可替代。

以上就是JavaScript中Object.defineProperty详解_javascript技巧的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/288691.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月4日 19:38:03
下一篇 2025年11月4日 19:42:11

相关推荐

  • 如何在PHPMyAdmin中设置访问日志记录

    phpmyadmin本身没有内置的访问日志功能,但可以通过mysql通用查询日志和web服务器日志实现操作追踪。1. 通过启用mysql的通用查询日志(general query log),可记录所有通过phpmyadmin执行的sql语句,包括用户执行的具体操作;2. web服务器(如apache…

    2025年12月11日 好文分享
    000
  • 解决 Laravel 与 Vue.js 应用中数据未正确显示的问题

    本文旨在帮助开发者解决在使用 Laravel 作为后端 API,Vue.js 作为前端框架构建应用时,数据无法正确显示的问题。通过分析常见的错误原因,并提供详细的代码示例和解决方案,确保数据能从 Laravel 后端成功传递到 Vue.js 前端,并正确渲染。 在使用 laravel 和 vue.j…

    2025年12月11日
    000
  • jQuery Ajax提交复杂表单数据:正确处理数组元素

    本教程详细讲解如何利用jQuery Ajax高效提交包含数组结构命名(如name=”item[0][prop]”)的HTML表单数据。通过使用jQuery.serialize()方法,可将此类复杂数据自动转换为标准的URL编码格式,确保服务器端(如PHP的$_POST超全局变…

    2025年12月11日
    000
  • 使用jQuery和Ajax提交包含数组命名元素的HTML表单

    本文详细介绍了如何使用jQuery的Ajax功能,正确提交包含数组命名(如name=”array[index][field]”)的HTML表单数据。通过利用jQuery.serialize()方法,可以确保数据以标准URL编码格式发送,从而在服务器端(如PHP的$_POST)…

    2025年12月11日 好文分享
    000
  • JavaScript日期操作:为HTML日期输入框设置动态最大日期

    本教程详细讲解如何使用JavaScript为HTML日期输入框动态设置最大日期。我们将学习如何从用户选择的日期中增加指定天数(例如21天),并利用Date对象的setDate()方法进行精确计算。文章还将指导如何将计算出的新日期格式化为HTML input type=”date&#822…

    2025年12月11日
    000
  • 解决Laravel AJAX重复提交时CSRF令牌失效问题

    本文探讨了在使用AJAX提交Laravel表单时,首次提交失败后再次提交出现“CSRF token mismatch”错误的问题。核心原因在于CSRF令牌可能在首次请求后失效或更新,而$.ajaxSetup中设置的静态令牌无法动态刷新。解决方案是将CSRF令牌的头部设置从$.ajaxSetup移至每…

    2025年12月11日
    000
  • Nginx环境下为PHP 7.4安装SOAP扩展的完整教程

    本文旨在解决在Nginx服务器上,为PHP 7.4版本安装SOAP扩展时遇到的常见问题。通过详细的步骤和代码示例,帮助开发者正确安装并启用SOAP扩展,从而确保PHP 7.4应用能够正常使用SOAP协议进行数据交换。文章涵盖了扩展安装、配置以及重启服务的关键步骤,并提供了一些常见问题的排查方法。 安…

    2025年12月11日
    000
  • 解决cPanel上Laravel“找不到SQL驱动”错误:PHP版本兼容性指南

    在cPanel部署Laravel项目时,若遭遇“could not find driver (SQL)”错误,即使pdo_mysql看似已启用,根源可能在于PHP版本配置不当。本文将详细指导如何通过检查phpinfo()确认实际PDO驱动状态,并演示如何修改cPanel的.htaccess文件,以切…

    2025年12月11日
    000
  • 安装 PHP 7.4 的 SOAP 扩展

    本文旨在帮助读者解决在 Ubuntu 系统上为 PHP 7.4 安装 SOAP 扩展的问题。通过标准的 apt 命令安装扩展,并确保在正确的 PHP 配置文件中启用,从而使 SOAP 功能在 PHP 7.4 环境下正常运行。 在 Ubuntu 系统上为 PHP 7.4 安装 SOAP 扩展,可以使用…

    2025年12月11日
    000
  • 为PHP 7.4安装SOAP扩展:一步步指南

    本文档旨在指导读者如何在Ubuntu 16.04.6系统上为PHP 7.4安装SOAP扩展。由于默认安装可能只针对PHP 7.0,本文将提供详细步骤,包括安装命令、配置修改以及常见问题的解决方案,确保SOAP扩展在PHP 7.4环境下正常运行。 安装SOAP扩展 最直接的方法是使用apt包管理器安装…

    2025年12月11日
    000
  • 如何使用PHP压缩文件?ZipArchive高级用法

    如何使用php的ziparchive类实现文件和目录的压缩?1. 创建压缩包:使用ziparchive类并调用addfile方法添加文件,通过ziparchive::create参数创建新文件;2. 压缩整个目录:递归遍历目录并逐个添加文件,注意路径拼接及过滤规则;3. 设置密码与注释:通过系统命令…

    2025年12月11日 好文分享
    000
  • 在macOS系统中安装PHPCMS的方法和注意事项

    在macos上安装phpcms需要先搭建php环境并配置相关服务。首先安装homebrew,接着使用homebrew安装php和mysql或mariadb,并启动数据库服务;然后安装composer并下载phpcms源码;随后配置apache虚拟主机和hosts文件,将phpcms解压至指定目录后通…

    2025年12月11日 好文分享
    000
  • 利用PHPMyAdmin执行SQL语句创建数据库视图

    登录phpmyadmin并选择目标数据库;2. 点击顶部“sql”标签进入执行界面;3. 编写create view语句,例如:create view view_name as select columns from table where condition;4. 输入具体视图定义,如包含单表筛选…

    2025年12月11日 好文分享
    000
  • PHP中的文件操作:如何读写和修改文件内容

    php读取文件的常用方法有6种:1.file_get_contents()适合小文件;2.fopen()+fread()适合大文件分块读取;3.fgets()逐行读取;4.fgetc()逐字符读取;5.readfile()直接输出文件内容;6.根据文件大小和处理需求选择合适的方法。写入文件主要有fi…

    2025年12月11日 好文分享
    000
  • HTML表单数据未被识别:原因与解决方案

    本文旨在解决HTML表单数据无法被PHP正确接收的问题。通过分析表单结构和提交方式,解释了数据丢失的常见原因,并提供了一个简洁的解决方案,确保所有表单元素的数据都能被正确提交和处理。 当你在PHP中尝试接收HTML表单提交的数据,却发现某些字段的值丢失,例如出现 “Undefined a…

    2025年12月11日
    000
  • 在PHPMyAdmin中修改用户的默认数据库

    在phpmyadmin中没有直接的“设置默认数据库”选项,因为其权限管理基于最小权限原则。要实现类似效果,需通过以下步骤调整用户权限:1. 进入“用户账户”选项卡并点击目标用户的“编辑权限”。2. 在权限编辑页面,移除不必要的全局权限(如存在)。3. 在“数据库特权”部分选择特定数据库并授予所需操作…

    2025年12月11日 好文分享
    000
  • 使用 PHP 数组生成 CSV 文件的完整教程

    本文旨在指导开发者如何使用 PHP 将两个或多个数组的数据合并并导出为 CSV 文件。我们将详细介绍如何正确地组织数组数据,以及如何使用 PHP 内置函数 fputcsv() 来生成符合 CSV 格式要求的文件内容,并提供两种实现代码示例。 在 PHP 中,将数组数据导出到 CSV 文件是一个常见的…

    2025年12月11日
    000
  • 备份和恢复PHPCMS网站的文件和数据

    备份和恢复phpcms网站的核心是备份网站文件和数据库。具体步骤如下:1. 备份网站文件:使用ftp/sftp下载整个phpcms目录并压缩保存;2. 备份数据库:通过phpmyadmin或mysqldump命令导出sql文件;3. 恢复网站文件:上传至服务器并设置正确权限;4. 恢复数据库:创建新…

    2025年12月11日 好文分享
    000
  • 让PhpStorm支持Emmet语法的设置步骤

    要解决 phpstorm 中 emmet 不生效的问题,需检查插件是否启用、设置快捷键、添加语言支持并测试补全功能。1. 进入 settings → plugins 确保 emmet 已启用;2. 在 keymap 中为 “expand abbreviation” 设置 tab 或其他快捷键;3. …

    2025年12月11日 好文分享
    000
  • PhpStorm的远程开发和调试功能的配置

    远程开发和调试在 phpstorm 中可通过配置服务器连接、设置映射关系和启用 xdebug 实现。1. 添加远程服务器:进入 settings > deployment > configuration,选择 sftp 类型,填写 host、port(通常为 22)、root path、…

    2025年12月11日 好文分享
    000

发表回复

登录后才能评论
关注微信