【JavaScript】——Object.defineProperty方法(详解)

KEIL5编译报错L6200E:__stdout重定义问题分析与解决 本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。 阅读详情

说到响应式原理,一定会提到JavaScriptES5中的API——Object.defineProperty()方法。也是面试会问的原理,今天我们来好好学习一下!


定义:

Object.defineProperty(),是一个静态方法,通过定义属性的元数据信息精确的控制属性的行为。

这定义讲了跟没讲似的,我来解读一下:

就是用来定义了对象之后,更改其属性值或者枚举其方法,定义中的行为就是指读或者写操作。

也就是说:

对象是由多个键/值对组成的无序的集合。对象中每个属性可以是任意类型的值。

定义对象可以使用构造函数或字面量的形式:

var obj = new Object;  //obj = {}
obj.name = "张三";  //添加描述
obj.say = function(){};  //添加行为

除了以上添加属性的方式,还可以使用Object.defineProperty定义新属性或修改原有的属性。

 语法:

        Object.defineProperty(obj,prop,descriptor)

参数解读:

        obj——表示要在其定义属性的对象

        prop——接收String、Symbol类型,表示要定义或者球盖的属性的名称

        descriptor——(很重要的属性)被定义或者修改的属性描述符,可以定义属性行为的元数据信息。大白话来讲就是说:通过它来限制属性的读写行为。         

返回值:

        返回一个Object。返回被传递给函数的对象obj


属性描述符分为两种:数据描述符和存取描述符。

这两者均有的键值有:configurable和enumerable

configurable:

布尔值。设为true时,才能再次修改该属性的属性描述符,同时该属性也能从对应的对象上被删除,默认false。(但我们一般使用Object.defineProperty时,要设置为true,因为我们需要去更改这些键值)

enumerable:

布尔值。设为true时, 该属性才能够出现在对象的枚举属性中,默认false。

也就是说:我们在循环一个对象的时候,把其中一个属性的enumerable设置为false,该属性就不会出现在这个循环中。


数据描述符特有的键值:

        value——表示该属性的初始值,可以是任何有效的JavaScript值,默认为undefined

        writable——布尔值。设为true时,表示该属性才能被写入值,默认false。

存取操作符特有的键值为:get和set,相当于拦截器,

        get——一个给属性提供getter的方法,如果没有getter则为undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象),默认为undefined。

        set——一个给属性提供setter的方法,如果没有setter则为undefined。当属性值修改时,出发执行该方法。方法将接受唯一参数,即该属性的新的参数值,默认为undefined。

具体我们看下面的代码示例就会明白。


1、数据描述符的创建示例:

 

2、存取描述符的创建示例:


再来做一道笔试题吧~

//以下代码的输出结果是:   
var o = { a: 1 };
Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: true});
o.a = 2;
o.b = 3;
console.log(o.a, o.b); 

答案是:2    2 

因为Object.defineProperty的第二个参数表示要定义或者球盖的属性的名称,在前面的知识我们知道, writable: false表示不可擦写,enumerable: false表示不可枚举,configurable: true表示可以再次修改该属性的属性描述符。

所以o.b的初始值为value=2,数据被劫持了,o.b不可擦写,不可枚举 ,即还是o.b还是2;

这里Object.defineProperty修改的是b属性,和a无关,o.a后面被修改为2那么o.a就是2。

YOLOv11 改进 - 检测头 | Detect_LSCD轻量共享卷积检测头:轻量化设计破解计算瓶颈,增强复杂场景目标感知能力 本文介绍了基于群归一化(GroupNorm)和共享卷积的轻量化检测头LSCD,并将其集成进YOLOv11。LSCD检测头充分利用了GroupNorm和共享卷积的优势,在保持特征信息有效融合的同时,减少计算量和运算复杂度。我们将LSCD的代码集成到YOLOv11检测头中,并在tasks文件中进行注册。实验证明,YOLOv11-LSCD在目标检测任务中取得了良好的效果。 阅读详情

相关推荐

从XSA到Linux应用:Petalinux与Vitis的嵌入式开发全流程解析

本文详细解析了从XSA文件到Linux应用的嵌入式开发全流程,重点介绍了Petalinux与Vitis工具链的使用技巧和实战经验。通过XSA硬件描述、Petalinux工程搭建、系统镜像优化及Vitis开发配置等关键步骤,帮助开发者高效完成ZYNQ平台开发,解决常见问题并提升开发效率。

weixin_29195217的博客 192

Object.defineproperty方法(详解)

Object.defineproperty方法(详解)

weixin_57677300的博客 2万+

STM32 FATFS文件系统按行读取SD卡数据

STM32 SD数据实现按行读取

qq_32216815的博客 7826

Object.defineProperty详解

Object.defineProperty() 允许精确地添加或修改对象上的属性。通过赋值添加的普通属性会在枚举属性时(例如 for...in、Object.keys() 等)出现,它们的值可以被更改,属性可以被删除。 当对象中不存在指定的属性时,Object.defineProperty() 将根据描述符创建一个新的属性。描述符中的字段可以省略,省略的字段将使用默认值。 当修改已存在的属性时,操作的结果取决于当前属性的配置,可能会成功、不执行任何操作,或抛出一个 TypeError 异常。

曹定栓的博客 9954

STM32F407串口DMA收发实战:标准库配置与环形缓冲区实现

DMA(直接存储器访问)是嵌入式系统中提升数据传输效率的核心技术,它允许外设与内存直接交换数据而无需CPU干预。其工作原理是通过专用硬件控制器接管数据搬运任务,CPU仅需初始化传输参数即可处理其他事务,从而显著降低系统负载。这项技术的核心价值在于释放CPU算力,实现高吞吐、低延迟的实时通信,尤其适用于数据采集、工业控制和通信网关等场景。在STM32F407等ARM Cortex-M4芯片中,串口结合DMA可实现稳定的高速数据流处理。本文以STM32F407标准库为基础,深入解析USART1的DMA发送与接收

weixin_29169899的博客 319

红外热成像仪原理及应用

目录什么是红外热成像背景介绍热成像技术原理热成像分类红外热成像和夜视仪之间的区别红外热像仪夜视仪红外照明相机对比红外热像仪都能看透什么如何选择制冷型和非制冷型红外热像仪制冷型红外热像仪非制冷型红外热像仪实例对比成像速度空间分辨率灵敏度光谱滤波同步何如选择合适的红外热像仪像素测温范围和被测物温度分辨率空间分辨率温度稳定性热像仪的距离系数比常见热成像仪关键参数量程视场角 (FOV)红外分辨率热灵敏度(NETD)焦距光谱范围精度内置优化分析NTED(热灵敏度)什么是NETD如何测量NETD?NETD如何影响测量?

zhy295006359的博客 2万+

Object.defineproperty

Object.defineproperty 的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性.。configurable:true //控制属性是否可以被删除,默认值是false。enumerable:true, //控制属性是否可以枚举,默认值是false。writable:true, //控制属性是否可以被修改,默认值是false。,获取值的时候会被调用,不设置时为。是获取值的时候的方法,类型为。是设置值的时候的方法,类型为。,设置值的时候会被调用,...............

书中自有妍如玉的博客 3172

sentaurus学习笔记(一)器件仿真

之前有跟大家说,以后转到sentaurus,因此silvaco会用的比较少,结果发现真的有一点贪心厌旧的感觉,现在基本上不用silvaco(lll¬ω¬)故这篇文章,将为大家带来的是关于sentaurus的结构仿真和器件的特性的提取。我们还是老规矩,先上结构图。 还是一个经典的IGBT结构,这是一个典型的N型IGBT,下面我将把一些相关的结构,和具体的写法用下面一幅图表达出来。 这里因为方便看,我们把器件的比例画的比较抽象。可以看到的是,这里有很多的距离参数是用一些变量名来写的,这也是sentaurus

weixin_43262021的博客 2万+

Object.defineProperty方法(详解)

OK,这一篇主要想说一下Object.defineProperty这个方法。 这个方法也是Vue数据双向绑定原理的常见面试题 所以也是有必要好好掌握的哦 首先我们知道JS中是支持面向对象编程的,也是有着对象和类这样的概念。 我们常见创建对象的方法应该是这样: var p1 ={ name:"lisi", } 那我们Object.defineProperty这个方法有什么用呢? 这个方法接收三个参数: 1.属性所在的对象 2.属性的名字 3.一个描述符对象 这个描述符对象是个什么东西呢? 他可以

weixin_46726346的博客 7万+

【软件逆向】带壳带反调试找flag教程(VMProtect3.0+X64dbg+ScyllaHide)

【软件逆向】带壳带反调试找flag教程(VMProtect 3.0+X64dbg+ScyllaHide)

zhangjiuding的博客 7510

基于知识图谱的智能决策系统

作者:禅与计算机程序设计艺术 1.简介 知识图谱(Knowledge Graph)最早由美国斯坦福大学的Jure Sifne等人于2013年提出,它是一个用于存储、整理和推理复杂多变的网络结构信息的数据模型。它的基本特征是每个事实都有一个统一的标识符ID,并且可以以图形的方式展示各种关系及其边缘。因此,

AI天才研究院 2185

Object.defineProperty()详解

Object.defineProperty()详解

qq_63470301的博客 2180

【RT-DETR涨点改进】独家Conv改进篇 | 来自TIP 2024顶刊| 引入 DEConv细节增强卷积模块, 能够恢复更多细节信息,提升小目标检测精度、含多种不同模型改进点

本文提出了一种细节增强卷积(DEConv)模块,通过融合多种差异卷积(CDC、ADC、HDC、VDC)来增强图像特征表示能力,特别在边缘和纹理细节提取方面表现突出。该模块采用重参数化技术,在不增加计算成本的情况下,将先验信息融入常规卷积层,显著提升了RT-DETR模型在模糊或遮挡场景下的目标检测精度。实验验证了DEConv在多种骨干网络(ResNet18/50、HGNet等)中的有效性,为实时目标检测系统提供了轻量高效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 452

JavaScript Object.defineProperty()方法详解

Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。语法Object.defineProperty(obj, prop, descriptor)参数 obj 需要定义属性的对象。 prop 需被定义或修改的属性名。 descriptor 需被定义或修改的属性的描述符。 描述该方法允许精确添加或修改对象的属性。一般情况下,我

Zain的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JS对象方法——Object.defineProperty()

JS对象方法——Object.defineProperty() 我们都知道Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更新实现双向数据绑定。可我们真的了解Object.defineProperty()吗。 Object.defineProperty() 方法会直接在一个对象上定义一个...

qq_42586895的博客 3848

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaScript 对象方法—— Object.keys() 和 Object.defineProperty()

ES5有两个常用的对象方法: 1 Object.keys() 语法: Object.keys(obj) 说明: Object.keys() 用于获取对象自身所有的属性; 效果类似for...in...; 返回一个由属性名组成的数组。 举例: var obj = { id: 1, pname: '小米', price: 1999, ...

weixin_41309331的博客 711

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JavaScript Object.defineProperty( ) 方法的使用

Object.defineProperty( )方法的使用 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。 Object.defineProperty(obj, prop, descriptor) 参数 : obj : 要定义属性的对象 prop :要定义或修改的属性的名称或 Symbol descriptor 要定义或修改的属性描述符 返回值:被传递给函数的对象 Object.definePropert

秋天,黄叶坠地,凉风有信。 904

【JS】JavaScript对象属性-属性类型-数据属性-访问器属性-Object.defineProperty()方法-get方法-set方法

文章目录1. 数据属性[[Configurable]][[Enumberable]][[Writable]][[Value]]1.1 在对象上定义1.2 使用Object.defineProperty()方法设置属性默认特性2. 访问器属性[[Configurable]][[Enumberable]][[Get]][[Set]]2.1 定义私有成员,设置get、set方法3. 设置多个属性 Object.defineProperties()4. 读取属性的特性Object.getOwnPropertyDes

YK菌的博客 1036

JavaScript 使用Object.defineProperty方法实现简单的双向绑定

前言 主要用到了 Object.defineProperty 这个方法, 改变对象属性时触发 set 方法 上代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>definePro

weixin_44953227的博客 4万+

js中Object.defineProperty()的方法详解

在JS中,Object.defineproperty(obj, prop, desc)的方法是给一个对象添加属性或者修改属性 1.obj是需要操作的对象 2.prop是需要定义的属性名 3.desc属性描述符 给对象添加属性赋值: object.defineProperty(user,'name',{ value:'aaaaa' }) 此时user对象是这样的 user{ name:'aaa...

qq_39594951的博客 480

【JS】Object.defineproperty方法

【JS】Object.defineproperty方法

owo_ovo的博客 1802

js中的Object.defineProperty方法

直接来一个案例,介绍在后面&lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;test&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="test

劲枫的博客 988

JS中Object.defineProperty()方法

Object.defineProperty()方法用来定义单个属性的属性描述符 Object.defineProperty(obj, propertyName, descriptor)

Harley567 487

JS之Object.defineProperty()方法

1.数据属性 修改属性默认的属性,必须使用ECMAScript的Object.defineProperty()方法。这个方法接收三个参数:属性所在的对象、属性的名字和一个描述性对象。其中,描述符对象的属性必须是:configurable、enumerable、writabel、和value。设置其中的一或多个值,可以修改对应的特性值。 var person = {}; Object.d...

回忆的夏天 987

JS中 Object.defineProperty() 方法的使用

JS中 Object.defineProperty() 方法的使用

小肉包的博客 847

js中神奇的Object.defineProperty方法

前端虫 2017-02-09 00:14 这个方法可牛比了。这么说吧,vue.js是通过它实现双向绑定的。俗称属性拦截器。而且专门用来监控对象属性变化的Object.observe方法也被草案发起人撤回了(此方法在node环境中仍能使用)。可见def...

qq_41629498的博客 831
上一篇: 【JavaScript】——JavaScript基础之e.target和this的区别
下一篇: 【正则表达式】——10个非常常见的正则表达式案例,轻松搞定正则表达式
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值