属性描述符

news2024/12/21 19:06:12

什么是属性描述符

1 数据描述符

2 存取描述符

3 获取属性描述符

4 设置属性描述符

4.1 配置writable 

4.2 配置configurable

4.3 configurable的特殊性

4.4 配置enumerable 

5.同时设置多个属性的属性描述符

6.get和set的用法具体看访问器属性getter和setter帖子。


什么是属性描述符

无论使用字面量创建对象,还是通过new Object创建对象,或者通过类去创建对象都无法对对象的属性进行一些限制,比如是否可以被枚举,是否可以被delete删除,如果我们想对一个属性进行比较精准的控制,就需要使用到属性描述符属性描述符需要使用Object.defineProperty来对象属性进行添加或者修改。

属性描述符分为两种:数据描述符(数据属性)和存取描述符(访问器属性)。

1 数据描述符

数据描述符一般是指数据属性的描述符,具有以下可选键值:

  • value:该属性对应的值。
  • writable:当且仅当该属性的writable为true时,value才能被赋值运算符改变。默认为false。
  • configurable:当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为false。
  • enumerable:当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为false。

2 存取描述符

数据描述符一般是指访问器属性的描述符,具有以下可选键值:

  • get:给属性提供getter的方法,如果没有getter则为undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象。
  • set:给属性提供setter的方法,如果没有setter则为undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
  • configurable:当且仅当该属性的configurable为true时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为false。
  • enumerable:当且仅当该属性的enumerable为true时,该属性才能够出现在对象的枚举属性中。默认为false。

3 获取属性描述符

通过Object.getOwnPropertyDescriptor() 方法去获取。

Object.getOwnPropertyDescriptor(obj,prop)

作用:获取目标属性的属性描述符。

参数:

  • obj:目标对象。
  • prop:目标对象上的目标属性。

返回值:目标属性的属性描述符。

    let person = {
      name: "于家宝",
      _age: 18,
    };
    console.log(Object.getOwnPropertyDescriptor(person, "_age"));

4 设置属性描述符

通过Object.defineProperty() 方法去设置。

Object.defineProperty(obj,prop,descriptor)

作用:在目标对象上定义或者修改一个属性,可以同时修改这个属性的属性描述符。

参数:

  • obj:目标对象。
  • prop:要定义或者修改的属性名称,是个字符串。
  • descriptor:将被定义或者修改的属性描述符。

返回值:目标对象。

    let person = {
      name: "于家宝",
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
    });
    console.log(person.job); // 程序员

注意:通过defineProperty() 方法定义的新属性,如果只设置value一个属性描述符,那么这个属性,是不可删除、不可修改、不可枚举的。

这是因为除了value属性描述符,其他的描述符writable、configurable、enumerable默认都是false。

    let person = {
      name: "于家宝",
      age: 18,
    };
    Object.defineProperty(person, "job", {
      value: "程序员", // 不配置writable,configurable,enumerable就都默认false
    });

    console.log(person.job); // 程序员
    person.job = "前端工程师";
    delete person.job;
    console.log(person.job); // 程序员,不可修改不可删除

    for (i in person) {
      console.log(i); // name  age  没有job  不可枚举
    }

4.1 配置writable 

此时设置writable为true后该属性就可以修改。

    let person = {
      name: "于家宝",
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
      writable: true,
    });
    console.log(person.job); // 程序员
    person.job = "前端工程师";
    console.log(person.job); // 前端工程师

4.2 配置configurable

设置configurable为true后该属性就可以被删除。

    let person = {
      name: "于家宝",
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
      configurable: true,
    });
    console.log(person.job); // 程序员
    delete person.job;
    console.log(person.job); // undefined

4.3 configurable的特殊性

还有一点需要注意,属性描述符configurable为true的时候,是可以修改该描述符configurable的,如果为false就无法修改该修饰符,这说明一旦configurable为false就是不可逆的。

  • 先设置为true,再修改为false,是可以生效的:
    let person = {
      name: "于家宝",
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
      configurable: true, // 先设置为true
    });
    Object.defineProperty(person, "job", {
      value: "程序员",
      configurable: false, // 再设置为false
    });
    console.log(person.job); // 程序员
    delete person.job;
    console.log(person.job); // 程序员  没有被删除,说明configurable修改为false成功了
  • 先设置为false,再修改为true,后台会报错。
    let person = {
      name: "于家宝",
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
      configurable: false, // 先设置为false
    });
    Object.defineProperty(person, "job", {
      value: "程序员",
      configurable: true, // 再设置为true,直接报错,configurable为false的时候是不可以修改该属性描述符的
    });

4.4 配置enumerable 

设置enumerable为true后该属性就可以被枚举。

    let person = {
      name: "于家宝",
      age: 18,
    };
    Object.defineProperty(person, "job", {
      value: "程序员",
      enumerable: true,
    });

    for (i in person) {
      console.log(i); // name  age  job
    }

5.同时设置多个属性的属性描述符

通过Object.defineProperties() 方法可以设置多个属性的属性描述符。

Object.defineProperties(obj,props)

作用:在目标对象上定义或者修改一个或多个属性,可以同时修改属性的属性描述符。

参数:

  • obj:目标对象。
  • props:一个对象,键值对是要定义或修改的属性名和其属性描述符。

返回值:目标对象。

    let person = {
      name: "于家宝",
      age: 18,
    };
    Object.defineProperties(person, {
      job: {
        value: "程序员",
        enumerable: true,
      },
      address: {
        value: "南京",
        enumerable: true,
      },
    });

    for (i in person) {
      console.log(i); // name  age  job  address
    }

6.get和set的用法具体看访问器属性getter和setter帖子。

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

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

相关文章

PostgreSQL技术内幕21:SysLogger日志收集器的工作原理

0.简介 在前面文章中介绍了事务模块用到的事务日志结构和其工作原理,本文将介绍日志的另一个部分,操作日志,主要去描述SysLogger日志的工作原理,流程以及其中关键的实现:日志轮转,刷盘性能问题等&#xff…

Unity3D仿星露谷物语开发6之角色添加动画

1、目的 给角色添加素材中的动画,最终让角色动起来。 2、准备工作 当前的预设体中的Player对象还不够完善,需要删除掉再优化下。此时应当:Hierarchy中的Player对象切断和预设体的关联,同时删除Prefabs中的Player对象。 首先&a…

Go框架比较:goframe、beego、iris和gin

由于工作需要,这些年来也接触了不少的开发框架,Golang的开发框架比较多,不过基本都是Web"框架"为主。这里稍微打了个引号,因为大部分"框架"从设计和功能定位上来讲,充其量都只能算是一个组件&…

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码,似乎不需要关闭写入方向,于是注释掉(关键) 2、将request的变量类型从string转为string_view(顺手…

现代风格VUE3易支付用户控制中心

适用系统 彩虹易支付 技术栈 vitevue3elementuiplusphp 亮点 独立前端代码,扩展开发,不改动系统文件,不影响原版升级 支持功能订制 界面预览

go语言zero框架中启动脚本.sh的编写与配置

在Go语言项目中,编写启动脚本 (.sh 文件) 通常用于自动化启动Go程序、配置环境变量、执行一些初始化任务或处理不同环境下的配置。下面是编写和配置启动脚本的步骤。 ### 1. 基本的 .sh 启动脚本 假设你已经在 Go 中编写了应用程序并编译为二进制文件,启…

React,Antd实现文本输入框话题添加及删除的完整功能解决方案

最终效果就是实现该输入框: 添加话题时,话题自动插入到输入框前面多文本输入框左侧间距为话题的宽度多行文本时,第二行紧接开头渲染删除文本时,如果删除到话题,再次删除,话题被删除 首先构造div结构 cons…

坑人 C# MySql.Data SDK

一:背景 1. 讲故事 为什么说这东西比较坑人呢?是因为最近一个月接到了两个dump,都反应程序卡死无响应,最后分析下来是因为线程饥饿导致,那什么原因导致的线程饥饿呢?进一步分析发现罪魁祸首是 MySql.Data,这就让人无语了,并且反馈都是升级了MySql.Data驱动引发,接下…

(五)FT2232HL高速调试器之--三步实现STM32的VSCODE在线仿真工程搭建

对于单片机开发,rtthread studios 与 vscode,鱼与熊掌可以兼得否,其实是可以的,下面通过三个步骤,实现基于FT2232HL高速调试器的,stm32的VSCODE在线仿真工程的搭建。 1、软件下载与VSCODE插件安装配置 软…

【计算机网络】lab2 Ethernet(链路层Ethernet frame结构细节)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现

鸿蒙项目云捐助第十讲鸿蒙App应用分类页面二级联动功能实现 在之前的教程中完成了分类页面的左右两侧的列表结构,如下图所示。 接下来需要实现左侧分类导航项的点击操作,可以友好的提示用户选择了哪一个文字分类导航项。 一、左侧文字分类导航的处理 …

数字IC后端零基础入门基础理论(Day1)

数字IC后端设计导入需要用到的input数据如下图所示。 数字后端零基础入门系列 | Innovus零基础LAB学习Day9 Netlist: 设计的Gate level(门级)网表。下图所示为一个计数器设计综合后的门级netlist。 从这个netlist中我们看到这个设计顶层的名字叫counte…

如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到

想要编译opencvffmpeg: 1.安装ffmpeg 随便位置(具体看ffmpeg 编译安装) 执行下面命令,其中/usr/local/ffmpeg/lib/pkgconfig是你实际的ffmpeg路径 export PKG_CONFIG_PATH$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig2.下载…

三维视频融合在数字孪生中的应用

一、在提升监控效率与决策准确性方面的应用 改善监控视角与理解:在数字孪生场景下,三维视频融合技术能够将监控视频与三维环境相结合。例如在城市安防、工业生产、大型活动等场景中,形成连续、实时、动态的三维全景拼接图。这解决了传统监控…

语音识别失败 chrome下获取浏览器录音功能,因为安全性问题,需要在localhost或127.0.0.1或https下才能获取权限

环境: Win10专业版 谷歌浏览器 版本 131.0.6778.140(正式版本) (64 位) 问题描述: 局域网web语音识别出现识别失败 chrome控制台出现下获取浏览器录音功能,因为安全性问题,需要在…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一:确认应答 TCP的序号和确认序号 核心机制二:丢包重传 核心机制三:连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四:滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

【Cadence射频仿真学习笔记】IC设计中电感的分析、建模与绘制(EMX电磁仿真,RFIC-GPT生成无源器件及与cadence的交互)

一、理论讲解 1. 电感设计的两个角度 电感的设计可以从两个角度考虑,一个是外部特性,一个是内部特性。外部特性就是把电感视为一个黑盒子,带有两个端子,如果带有抽头的电感就有三个端子,需要去考虑其电感值、Q值和自…

AutoSarOS中调度表的概念与源代码解析

--------AutoSarOS调度表的概念 一、AutoSarOS 是什么以及调度表的重要性 AutoSar(Automotive Open System Architecture)是汽车行业的一个开放式软件架构标准哦。它就像是一种大家都遵循的规则,能让不同的软件供应商一起合作开发汽车软件,这样软件就能被重复使用,开发效…

对golang的io型进程进行off-cpu分析

背景: 对于不能占满所有cpu核数的进程,进行on-cpu的分析是没有意义的,因为可能程序大部分时间都处在阻塞状态。 实验例子程序: 以centos8和golang1.23.3为例,测试下面的程序: pprof_netio.go package m…

VS项目,在生成的时候自动修改版本号

demo示例:https://gitee.com/chenheze90/L28_AutoVSversion 可通过下载demo运行即可。 原理:通过csproject项目文件中的Target标签,实现在项目编译之前对项目版本号进行修改,避免手动修改; 1.基础版 效果图如下 部…