JavaScript之Object.defineProperty详解

Object.defineProperty 是 JavaScript 中用于定义或修改对象属性的方法之一。它允许我们精确地控制对象属性的特性,包括可枚举性、可写性、可配置性等。

1. 基本语法

Object.defineProperty(object, propertyName, descriptor);
  • object:要在其上定义属性的对象。
  • propertyName:要定义或修改的属性的名称。
  • descriptor:属性的描述符对象,包含属性的特性。

2. 描述符对象(Descriptor Object)

描述符对象是一个普通的 JavaScript 对象,它有一些可选的键值对,用于定义属性的特性。

  • value:属性的值,默认为 undefined
  • writable:属性是否可写,默认为 false
  • enumerable:属性是否可枚举,默认为 false
  • configurable:属性是否可配置,默认为 false

3. 示例

3.1 定义可写属性
const obj = {};

Object.defineProperty(obj, 'name', {
  value'John',
  writabletrue// 可写
});

console.log(obj.name); // 输出:John
obj.name = 'Doe';
console.log(obj.name); // 输出:Doe
3.2 定义不可写属性
const obj = {};

Object.defineProperty(obj, 'name', {
  value'John',
  writablefalse// 不可写
});

console.log(obj.name); // 输出:John
obj.name = 'Doe'// 没有影响
console.log(obj.name); // 输出:John
3.3 定义可枚举属性
const obj = {};

Object.defineProperty(obj, 'name', {
  value'John',
  enumerabletrue// 可枚举
});

for (let key in obj) {
  console.log(key); // 输出:name
}
3.4 定义不可枚举属性
const obj = {};

Object.defineProperty(obj, 'name', {
  value'John',
  enumerablefalse// 不可枚举
});

for (let key in obj) {
  console.log(key); // 无输出
}
3.5 定义不可配置属性
const obj = {};

Object.defineProperty(obj, 'name', {
  value'John',
  configurablefalse// 不可配置
});

delete obj.name; // 无效
console.log(obj.name); // 输出:John

4. 优缺点

4.1 优点
  • 精确控制属性: Object.defineProperty 允许我们精确地控制属性的各种特性,包括可写性、可枚举性、可配置性等。

  • 属性默认值: 如果不显式指定某个特性,它会取默认值。这有助于防止意外的属性变更。

  • 防止误操作: 可以通过设定属性为不可写、不可配置,防止对属性的误操作。

4.2 缺点
  • 繁琐: 使用 Object.defineProperty 语法相对繁琐,特别是在需要定义多个属性时,可能使代码变得冗长。

  • 不适合大规模应用: 当需要频繁定义多个属性时,可能不够灵活和高效。

  • 兼容性: 在一些老版本的浏览器中可能存在不兼容的情况。

5. 注意事项

  • 使用 Object.defineProperty 时,需要注意特性之间的互斥关系,如 writablegetset 互斥。

  • 一旦将属性的 configurable 特性设为 false,就无法再将其设回 true。这意味着无法删除这个属性,也无法修改它的特性。

6. 适用场景

  • 属性特性定制: 当需要对属性进行精确的特性定制时,比如定义计算属性、阻止属性被遍历等。

  • 兼容性处理: 在需要与旧有代码或浏览器兼容时,可以使用 Object.defineProperty 进行属性特性的模拟。

  • 封装性: 当需要封装对象属性,防止外部直接访问或修改时,可以使用 Object.defineProperty

  • 特殊属性: 当需要定义一些特殊属性,比如不可写、不可配置、不可枚举等时,可以使用该方法。

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/809780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyQt5】环境配置

PyQt5 环境配置 一、前言1.1 PyQt5介绍1.2 PyCharm集成Pyqt5 二、pyqt5安装三、PyQt5-tools工具包安装四、常用工具环境配置4.1、环境变量配置4。2、验证是否安装成功 五、pycharm中设置Qt工具(Qt Designer、PyUIC、PyRcc)5.1、配置Qt Designer5.2、配置…

gitee上传出现git did not exit cleanly (exit code 1)的错误

在最后push的时候出现下面的结果: 出现这个错误的原因有好多种,目前介绍博主遇到的两种: 在第一次进行push操作的时候,需要输入用户名和密码,如果输入错误,则最后可能会出现上述报错 解决方法:…

centos7安装 on-my-zsh

如下👇 yum install -y zsh chsh -s /bin/zsh yum install -y git sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 重启即可生效啦~

Python爬虫怎么挣钱?6个Python爬虫赚钱方式,搞搞副业不是问题

1.最典型的就是找爬虫外包活儿 网络爬虫最通常的的挣钱方式通过外包网站,做中小规模的爬虫项目,向甲方提供数据抓取,数据结构化,数据清洗等服务。新入行的程序员大多都会先尝试这个方向,直接靠技术手段挣钱&#xff0…

Oladance、南卡、Cleer开放式耳机好不好用?深度测评剖析实力王!

​近期,不少朋友都在询问如何挑选适合自己的开放式耳机。面对市场上众多品牌的开放式耳机,它们在音质、舒适度和性能上都有所差异,挑选一款合适的耳机对于音乐爱好者来说尤为重要。购买到品质不达标的耳机可能会影响音乐体验,甚至…

Linux nfs 环境搭建

1.开发背景 nfs 即网络文件共享,主要通过 tcp、udp 等网络通讯的方式实现不同机器间的文件共享 2.开发需求 搭建 ubuntu 下的服务端,嵌入式开发板共享 ubuntu 的某个文件夹 3.开发环境 ubuntu20.04 嵌入式开发板 4.实现步骤 4.1 搭建 ubuntu 服务器…

sonar搭建(linux系统)

前景 静态代码扫描是CI/CD中重要的一环,可以在代码提交到代码仓库之后,在CI/CD流程中加入代码扫描步骤,从而及时地对代码进行质量的检查。这可以有效地降低后期维护成本,优化产品质量,提高产品交付速度。同时&#xf…

浅尝一下ECS(Entity Component System)(学习笔记)

参考文章:浅谈Unity ECS(一)Uniy ECS基础概念介绍:面向未来的ECS - 知乎 (zhihu.com) 视频链接:【青幻译制】GDC讲座系列之三 守望先锋的游戏架构和网络代码_哔哩哔哩_bilibili 云风的 BLOG: 浅谈《守望先锋》中的 E…

XSS攻击与MySQL注入漏洞攻击手法

一、XSS攻击 概念:XSS攻击也被称为 “跨站脚本攻击”,通过将恶意得Script代码注入到Web页面中,当 用户 浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击 用户的目的。 攻击对象&#…

保证线程安全的10个小技巧分享

对于从事后端开发的同学来说,线程安全问题是我们每天都需要考虑的问题。 线程安全问题通俗的讲:主要是在多线程的环境下,不同线程同时读和写公共资源(临界资源),导致的数据异常问题。 比如:变…

计算两个日期之间相差的天数的四种方法

计算两个日期之间相差的天数的四种方法 第一种:时间戳的方式,计算两个日期的时间戳的差,再除当天的毫秒数即可得到相差的天数。 public static void main(String[] args) {DateFormat dft new SimpleDateFormat("yyyy-MM-dd");t…

家居网购项目(一)

文章目录 1.前置知识1.项目开发阶段2.Java经典三层架构3.项目具体分层(包方案)4.MVC 2.开发环境搭建1.新建普通javaweb项目,导入jar包2.创建项目结构3.搭建前端页面 3.会员注册前端js校验1.需求分析2.代码login.html 3.结果4.调试阶段1.验证信…

LeetCode 题目:两个总和

LeetCode 题目:两个总和 描述: 编写一个函数,输入为一个整数数组nums和一个目标整数target,要求找到数组中两个数的和等于target,并返回这两个数的索引。 函数定义: def two_sum(nums: List[int], targe…

Java多线程开发——基础篇

目录 1.基本概念 2.创建线程方式 2.1直接建立线程 2.2实现Runnable接口 3.3实现Callable接口 3.4 了解Future接口 Future模式主要角色及其作用 3.5实例化FutureTask类 3.实现线程安全 3.1定义 3.2不安全原因 3.3解决方案 3.4volatile与synchronized区别 4.极端情…

Docker 学习笔记(三):Centos7 中 Docker 使用,镜像、容器,以及操作等常用命令小结

一、前言 记录时间 [2024-4-7] 前置文章: Docker学习笔记(一):入门篇,Docker概述、基本组成等,对Docker有一个初步的认识 Docker学习笔记(二):在Linux中部署Docker&#…

【数据结构】FHQ-Treap

因为想要学可持久化平衡树,但是之前用平衡树基本都是splay这种需要旋转的,不利于可持久化,所以今天来学一下fhq-treap这种不需要旋转的平衡树 fhq-treap是一种基于分裂(split)和合并(merge)的一…

(Java)数据结构——排序(第一节)堆排序+PTA L2-012 关于堆的判断

前言 本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。 堆排序(Heap Sort)概念 堆排序是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小…

从库延迟案例分析

背景介绍 近来一套业务系统,从库一直处于延迟状态,无法追上主库,导致业务风险较大。从资源上看,从库的CPU、IO、网络使用率较低,不存在服务器压力过高导致回放慢的情况;从库开启了并行回放;在从…

Python —— 简述

Houdini Python | 笔记合集 - 知乎 Houdini内置三大语言: 表达式,主要用于节点参数控制,可实现跨模块控制;vex,速度最快(比表达式和Python快一个数量级),非常适合密集型计算环境&…

【React】Ant Design社区扩展库之分割面板:react-resizable-panels

主角:react-resizable-panels 简介:来之Ant Design官方文档社区精选组件 1、效果 2、环境 react-resizable-panels: ^2.0.16next: 14.1.3react: ^18 3、安装 # npm npm install react-resizable-panels# yarn yarn add react-resizable-panels# pnpm …