js的属性描述符

news2024/11/19 7:36:42

目录

  • 属性描述符
  • 数据属性描述符
    • writable
    • enumerable
    • configurable
    • value
  • 存取属性描述符
    • get
    • set
    • 关于get与set
  • 通过Object.defineProperty实现响应式

属性描述符

ES5之前,我们虽然能通过字面量的形式直接在对象上添加或修改属性,但终究不能对其进行更加精细的管理,如此属性是否可重写可否被枚举等等
于是在ES5中推出了属性描述符属性描述符用于描述一个对象上指定的属性的特性或功能,属性描述符本身也是一个对象
属性描述符具体可分为两类,一类为数据属性描述符,一类为存取属性描述符
我们可以通过Object.getOwnPropertyDescriptor来获取一个指定对象上指定属性属性描述符

var obj = {
    name: '张三',
    age: 18
}
let desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc)

结果
Object.getOwnPropertyDescriptor需要传入两个参数,一个是指定的对象,一个是对象上的属性名,返回一个对象
如果想要设置属性描述符的话则需要使用Object.defineProperty

var obj = {
    name: '张三',
    age: 18
}
Object.defineProperty(obj, 'name', {
    value: '李四',
})
let desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc)

结果
Object.defineProperty需要传入三个参数,第一个是指定的对象,第二个是指定的属性名,第三个就是该属性的属性描述符

数据属性描述符

假如我们有这么一个对象,这个对象存储着一个商品的信息,其中name为商品名,price为商品售价,purchase为进价,count为商品的数量

var goods = {
    name: "apple",
    price: 10,
    count: 10,
    purchase: 5
}

writable

现在我们希望name属性不能被重写,我们就可以通过属性描述符实现

Object.defineProperty(goods, "name", {
    writable: false
})

writable即表示此属性能否被重写,如果为false就不能被重写

goods.name = "banana"
console.log(goods.name)

结果
我们可以看到赋值无效

enumerable

现在我们觉得purchase这个属性并不适合展示出来,我们就可以这么修改属性描述符

Object.defineProperty(goods, "purchase", {
    enumerable: false
})

enumerable即表示此属性能否被for...inObject.keys遍历到,如果为false则遍历不到

for (const key in goods) {
    console.log(key)
}
console.log(Object.keys(goods))

结果

configurable

现在我们觉得price这个属性已经配置的很好了,希望以后这个属性的属性描述符不会再改变,我们就可以这么修改属性描述符

Object.defineProperty(goods, "price", {
    configurable: false
})

configurable即表示这个属性的属性描述符在此次修改之后能否再次被修改,如果为false则此次修改之后之后再无法修改此属性的属性描述符

Object.defineProperty(goods, "price", {
    configurable: true
})

结果
我们发现如果想再次修改属性描述符的话控制台会直接报错

value

最后再来谈谈value属性,value就是此属性的,嗯,没了

存取属性描述符

我们还是有一个商品对象

var goods = {
    name: "apple",
    price: 10,
    count: 10,
    purchase: 5
}

现在我们同样需要price属性不能被修改,不仅不能被修改,还需要在修改的时候报错,这时候我们如果仅仅使用数据属性描述符是无法实现的,需要使用存取属性描述符

get

get也被称为getter,如果配置了get方法,那么当用户访问此属性时会调用get方法,如果没有配置get则为undefined

var price = goods.price

Object.defineProperty(goods, "price", {
    get() {
        return price
    }
})

set

set也被称之为setter,如果配置了set方法,那么当用户设置此属性时会调用set方法,如果没有配置set则为undefinedset方法会有一个参数,这个参数就是你设置此属性时传递的,如

goods.price = 2

这里的2就会被传入set

var price = goods.price

Object.defineProperty(goods, "price", {
    set(val) {
        price = val
    }
})

setget合起来被称之为访问器,无论是get还是set,他们都是对象属性上的一种绑定机制,这个机制能让函数与属性关联起来,无论这个属性在之前是否有定义,或是否有值,在定义了getset的那一刻,它就成了一个特殊的属性
现在我们回到最开始的问题,如果我们希望price不能被修改并且在尝试修改price时会报错的话就可以这么写

var price = goods.price

Object.defineProperty(goods, "price", {
    get() {
        return price
    },
    set(val) {
        throw new Error("不允许修改价格")
    }
})
console.log(goods.price)
goods.price = 20
console.log(goods.price)

结果
结果

关于get与set

getset中不能访问当前设定的属性,如果访问了的话会无限递归,直到撑爆执行栈,强制报错

var price = goods.price

Object.defineProperty(goods, "price", {
    get() {
        return goods.price
    },
    set(val) {
        throw new Error("不允许修改价格")
    }
})
console.log(goods.price)
goods.price = 20
console.log(goods.price)

结果

通过Object.defineProperty实现响应式

具体可以看我这篇文章
未动笔,未来可寄

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

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

相关文章

给数据分列的案例操作-LH-camera

简单介绍 利用xlrd读取xls数据,给xls表添加"所属平台"字段分列(以最长分列为准,填充空格)。利用openpyxl,将分列后数据存储到xls文件中,名字格式固定。 具体代码 # 用户原始表格存放位置&…

Polar-Net:通过 OCTA(光学相干断层扫描血管成像)检测阿尔茨海默病

通过OCTA(光学相干断层扫描血管成像)检测阿尔茨海默病 主问题:如何通过OCTA图像有效地检测阿尔茨海默病?子问题1:如何在深度学习模型中模拟临床实践中常用的区域基础分析方法?子问题2:如何在网络…

Python算法题集_环形链表

Python算法题集_环形链表 题234:环形链表1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【集合检索】2) 改进版一【字典检测】3) 改进版二【双指针】 4. 最优算法 本文为Python算法题集之一的代码示例 题234:环形链表 …

掌握CSS网格函数fit-content()的妙用

CSS网格布局是一种强大的布局系统,它提供了灵活的网格化设计能力。其中,fit-content()函数是一项重要的功能,它可以帮助我们在网格容器中自动调整网格项的尺寸。本文将详细讲解fit-content()函数的使用方法及其常见应用场景,助你掌…

2月4日作业

1.请编程实现双向链表的头插,头删、尾插、尾删 头插: 尾插: 头删: 尾删: 2.请编程实现双向链表按任意位置插入、删除、修改、查找 插入: 删除: 查找: 修改: 头文件&am…

Golang 学习(二)进阶使用

二、进阶使用 性能提升——协程 GoRoutine go f();一个 Go 线程上,可以起多个协程(有独立的栈空间、共享程序堆空间、调度由用户控制)主线程是一个物理线程,直接作用在 cpu 上的。是重量级的,非常耗费 cpu 资源。协…

msvcp120.dll丢失如何解决/找不到msvcp120.dll的5种有效的解决方法

在计算机系统运行过程中,如果遇到“找不到msvcp120.dll”的提示信息,这代表了何种具体状况呢?首先,我们需要明确msvcp120.dll文件的重要性。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分,这是一…

Java入门之JavaSe(韩顺平p1-p?)

学习背景: 本科搞过一段ACM、研究生搞了一篇B会后,本人在研二要学Java找工作啦~~(宇宙尽头是Java?)爪洼纯小白入门,C只会STL、python只会基础Pytorch、golang参与了一个Web后端项目,可以说项目小…

数据库学习笔记2024/2/5

2. SQL 全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了 一套操作关系型数据库统一标准 2.1 SQL通用语法 在学习具体的SQL语句之前,先来了解一下SQL语言的通用语法。 1). SQL语句可以单行或多行书写&…

查大数据检测到风险等级太高是怎么回事?

随着金融风控越来越多元化,大数据作为新兴的技术被运用到贷前风控中去了,不少人也了解过自己的大数据,但是由于相关知识不足,看不懂报告,在常见的问题中,大数据检测到风险等级太高是怎么回事呢?小易大数据…

支持534种语言,开源大语言模型MaLA-500

无论是开源的LLaMA 2还是闭源的GPT系列模型,功能虽然很强大,但对语言的支持和扩展比较差,例如,二者都是以英语为主的大模型。 为了提升大模型语言的多元化,慕尼黑大学、赫尔辛基大学等研究人员联合开源了,…

第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例系列短博文目录前言一、OpenCV图像特征提取与描述介绍二、OpenCV图像特征提取与描述初步示例代码三、扩展思路介绍四、特征点筛选和匹配优化示例代码五、多尺度特征提取示例代码六、非局部特征描述子示例代码…

【数据结构与算法】之排序系列-20240205

这里写目录标题 一、1346. 检查整数及其两倍数是否存在二、1365. 有多少小于当前数字的数字三、1460. 通过翻转子数组使两个数组相等四、1491. 去掉最低工资和最高工资后的工资平均值五、1502. 判断能否形成等差数列 一、1346. 检查整数及其两倍数是否存在 简单 给你一个整数数…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比,工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现,并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

CodeMeter强化了ETM WinCC 开放架构平台的许可与安全保护

在面对日益复杂的网络安全威胁时,ETM professional control采取了前瞻性的措施,选择了业界领先的威步CodeMeter技术,以保护其标志性的WinCC开放架构平台。这一选择不仅体现了ETM对安全的高度重视,也标志着其在保障关键基础设施运营…

见龙在田,预防性保护措施让文物传承千年

一、“见龙在田——山西出土龙文物展” “见龙在田——山西出土龙文物展”以十二生肖龙为线索,在山西省考古研究院(山西考古博物馆)揭幕,深入展示了中国优秀传统文化的悠久历史。展览汇聚了130多件珍贵历史文物。从新石器时代到汉…

2.0 Zookeeper 安装配置

Linux 安装 zookeeper 下载地址为: Apache ZooKeeper。 选择一稳定版本,本教程使用的 release 版本为3.4.14,下载并安装。 打开网址 https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz,看到如下界…

Linux中有名管道和无名管道

无名管道基础 进程间通信介绍 常用通信方式 无名管道(pipe) 有名管道 (fifo) 信号(signal) 共享内存(mmap) 套接字(socket)过时的IPC通信方式 System V IPC 共享内存(sh…

机器学习---概率图模型(隐马尔可夫模型、马尔可夫随机场、条件随机场)

1. 隐马尔可夫模型 机器学习最重要的任务是根据已观察到的证据(例如训练样本)对感兴趣的未知变量(例如类别标 记)进行估计和推测。概率模型(probabilistic model)提供了一种描述框架,将描述任…

【Qt Design】界面介绍

文章目录 前言Widget Box(工具箱)对象查看器Qt Design属性编译器sizePolicy内容 信号/槽编辑器资源浏览器ui文件 前言 Widget Box(工具箱) 提供很多控件 对象查看器 对象查看区域,可以查看主窗口放置对象的列表 …