Object.defineProperty和Proxy

PADS安装教程(超详细) 声明:个人实践 一、工具准备 pads9.5完整破解版百度网盘提取码【wjx9】 链接:https://pan.baidu.com/s/1pIP6BJO435ssmF7Hjwyz8A 提取码:wjx9 安装环境:win10 64位 二、开始解压安装 关闭杀毒,exe以管理员身份运行 点击【skip】,不然又得licese 点击【agree】 点击【modify】 设置安装的工具、路径及工程路径 设置完成后,开始【install】 在之后注册。 将Crack复制到PADS安装目录 阅读详情

Vue3.0中,van You 放弃了Object.defineProperty,加入了Proxy来实现数据劫持,那么这两个函数有什么区别呢?本文深入的剖析一下两者的用法以及优缺点,相信看文本文你也会理解为什么Vue会选择Proxy。

认识 defineProperty 及其缺陷

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

// obj:要定义属性的对象。
// prop:要定义或修改的属性的名称。
// descriptor:要定义或修改的属性描述符。
Object.defineProperty(obj, prop, descriptor)

简单示例:

var user = {}
Object.defineProperty(user, 'name', {
  value: 'erikchan'
})

descriptor 属性描述是个对象,有以下属性:

属性名描述默认值
value属性的值undefine
configurable属性描述是否可修改
属性描述是否可以删除
false
enumerable对象是否可枚举false
writable对象是否可重写false
get访问改对象时, 调用此函数undefine
set属性值被修改时,调用此函数undefine
// get 和 set 劫持数据
Object.defineProperty(user, "name", {
    get: function(){
        console.log('get name')
        return initName
    },
    set: function(val){
        console.log('set name')
        initName = val
    }
});

Object.defineProperty能够通过 get 和 set 劫持对象的属性,但是需要对对象的每一个属性进行遍历劫持;如果对象上有新增的属性,则需要对新增的属性再次进行劫持;如果属性是对象,还需要深度遍历。这也是为什么Vue给对象新增属性需要通过$set的原因,其原理也是通过Object.defineProperty对新增的属性再次进行劫持。

看一下 Object.defineProperty 对数组的劫持:

var list = [1,2]

Object.defineProperty(list,  index, {
    get: function(){
        console.log("get index:" + index)
        return initName
    },
    set: function(val){
        console.log("set index:" + index);
        initName = val
    }
});

list[1] = 0; 			// set index:1
list.push(-1) 			// 无输出
list.length = 5 		
console.log(list[4]) 	// undefined

但是 Object.defineProperty 在劫持对象和数组存在以下缺陷:

  • 无法检测到对象属性的添加或删除

  • 无法检测数组元素的变化,需要进行数组方法的重写

  • 无法检测数组的长度的修改

认识 Proxy

Proxy 相对 defineProperty,不在局限某个属性,而是直接对整个对象进行代理.

Proxy可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。

基本语法:

var proxy = new Proxy(target, handler);

实例:

var target = {}

var proxyObj = new Proxy(
    target,
    {
        get: function (target, propKey, receiver) {
            console.log(`getting ${propKey}!`);
            return Reflect.get(target, propKey, receiver);
        },
        set: function (target, propKey, value, receiver) {
            console.log(`setting ${propKey}!`);
            return Reflect.set(target, propKey, value, receiver);
        },
        deleteProperty: function (target, propKey) {
            console.log(`delete ${propKey}!`);
            delete target[propKey];
            return true;
        }
    }
);

可以看到Proxy直接代理了target整个对象,并且返回了一个新的对象,通过监听代理对象上属性的变化来获取目标对象属性的变化, 并且 deleteProperty 还能监听属性的删除。

proxy 处理数组的劫持:

var list = [1,2]
var proxyObj = new Proxy(list, {
    get: function (target, propKey, receiver) {
        console.log(`getting ${propKey}!`);
        return Reflect.get(target, propKey, receiver);
    },
    set: function (target, propKey, value, receiver) {
        console.log(`setting ${propKey}:${value}!`);
        return Reflect.set(target, propKey, value, receiver);
    },
})

proxyObj[1] = 0; 		// setting 1:0
proxyObj.push(-1) 		// getting push!  getting length! setting 2:-1! setting length:3!
proxyObj.length = 5 	//setting length:5!

从上可以看出, 不管是数组下标或者数组长度的变化,还是通过函数调用,Proxy都能很好的监听到变化。

《UDS协议从入门到精通》系列——图解0x14:清除诊断信息 图解0x14:清除诊断信息,简洁易懂,迅速上手! 阅读详情

相关推荐

OpenHarmony实战开发-如何实现文件分布式同步编辑

在分布式文件场景中,分布式设备管理包含了分布式设备搜索、分布式设备列表弹窗、远端设备拉起三部分。首先在分布式组网内搜索设备,然后把设备展示到分布式设备列表弹窗中,最后根据用户的选择拉起远端设备。两台设备组网的分布式场景是工作中常常需要的。这样的分布式场景有助于加快工作效率,减少工作中的冗余,本例将为大家介绍如何实现上述功能。​ (2)订阅分布式数据变化:通过this.distributedObject.on(‘status’, this.statusCallback)监听分布式数据对象的变更。

2401_82546228的博客 751

Object.defineproperty方法(详解)

Object.defineproperty方法(详解)

weixin_57677300的博客 2万+

UE5垃圾回收优化实战:定位GC卡顿与内存泄漏

垃圾回收(GC)是Unreal Engine 5中保障UObject内存安全的核心机制,其基于引用图的标记-清除原理决定了性能高度依赖引用结构合理性。当GC频繁触发或单次耗时突增,往往映射出蓝图强引用冗余、C++根对象管理失控或资源生命周期设计缺陷等底层问题。技术价值在于降低主线程阻塞、稳定60帧体验、抑制内存异常增长;典型应用场景包括关卡切换卡顿、UI打开后持续GC、打包后内存不释放等。本文聚焦UE5特有的Full GC模式、UObject生命周期约束及GC触发时机不可见性,提供从蓝图变量规范、TSoft

weixin_31995251的博客 362

Object.defineProperty详解

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

曹定栓的博客 9954

Matlab TreeBagger实战:用随机森林预测房价的5个关键步骤(附完整代码)

本文详细介绍了使用Matlab的TreeBagger工具包构建随机森林模型预测房价的完整流程。通过波士顿房价数据集实战,涵盖数据预处理、模型构建、参数调优、特征重要性分析及高级应用(如分位数回归)等5个关键步骤,并附有完整代码,帮助读者快速掌握这一强大的回归分析工具。

ol789012的博客 444

2021秋-北邮计算机导论期末考试(BUPT)

2021秋-北邮计算机导论期末考试(BUPT) 难度较低适合新手练习

weixin_73985779的博客 1498

Object.defineproperty

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

书中自有妍如玉的博客 3172

Ubuntu声卡检测与故障排查:从基础命令到驱动修复

本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。

g2h3i4j5的博客 228

【JS】Object.defineProperty与Proxy

【JS】Object.defineProperty与Proxy

owo_ovo的博客 2129

Voicebox本地部署:模型下载与离线模式实战指南

在本地语音处理场景中,模型下载失败和离线运行需求是开发者最常遇到的两大难题。理解语音工具的本地推理原理,关键在于掌握模型文件与程序逻辑的分离管理:模型独立下载,程序负责推理,输出留在本机。这种架构带来显著的技术价值——数据不出本地、不依赖公网、批量任务不中断。无论是语音识别转写、语音合成,还是集成到自动化脚本中,本地离线模式都能在隐私敏感或网络不稳定环境下稳定运行。对开发者而言,先解决模型文件的完整获取,再验证离线启动流程,就能绕过“无法下载模型”的常见坑。本文从环境准备、模型放置、服务启动到接口调用,提供

weixin_29048309的博客 306

DeepSmote:一种深度SMOTE方法

DeepSmote 一种全新的将深度学习与Smote相结合的过采样方法! 目前在许多领域已经被使用,值得大家关注学习!

走在深度学习前沿的小宋 1446

Object.defineProperty和Proxy区别

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

Mybells 1万+

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

一步到位解决Docker拉取镜像失败的问题!超详细的Docker代理设置教程!(使用代理解决群晖Docker获取注册表失败的问题)

XiaoqiangClub的博客 1万+

Object.defineProperty和Proxy的比较

Object.defineProperty和Proxy的比较一.Object.defineProperty 介绍1.基本用法2.在vue2.x中的应用二.Proxy 介绍基本用法三.Object.defineProperty和Proxy对比 一.Object.defineProperty 介绍 1.基本用法 Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性 Object.defineProperty(obj, prop, desc); /

weixin_42682011的博客 1874

OV9734 DATASHEET,完整规格书

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Object.defineProperty 和 proxy

Object.defineProperty Object.defineProperty这个并不是es6的语法,这个是给一个对象,添加属性,但是目前框架很多实用这个方法,来实现数据劫持,也就是数据双向绑定 // 平时我们这样给一个对象添加属性 let obj = {str:"hello swr"} obj.str = 'goodbye swr' console.log(obj.str) // 'goodbye swr' 当我们想在给一个对象,读取值或写入值时,进行的操作 // 使用Object.define

沙鑫741的博客 524

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

object.defineProperty和proxy、nextTick

代理(Proxy)是 ES6 中新增的一个特性,它可以用来自定义对象中的操作。代理是一个对象,它可以拦截并重定义基本操作,如属性查找、赋值、枚举、函数调用等。代理对象可以用来创建一个对象的代理,并且可以拦截对该对象的所有操作。

weixin_45392204的博客 986

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Object.defineProperty和Proxy对比

Object.defineProperty(obj, prop, descriptor) MDN文档 第三个参数的解释: configurable:属性是否可配置(重新defineProperty),是否可删除,默认false enumerable:属性可否被遍历,默认false writable:配合value使用,可否修改value,默认false value:默认undefine...

samfung09的博客 765

Object.defineProperty和proxy

一文搞懂Object.defineProperty和Proxy,Vue3.0为什么采用Proxy

xiaoshunshi的博客 1333

Object.defineProperty和Proxy的区别

1.Object.defineProperty 适用场景:需要兼容旧浏览器(如 IE9-11)。只需要拦截特定、已知属性的读写操作。对数组响应式要求不高或愿意手动处理数组方法的场景。Vue 2 的响应式系统是其最著名的应用。2.Proxy 适用场景 (优先选择):现代浏览器环境或 Node.js 环境。需要创建全面、灵活的拦截器,覆盖对象的多种操作(增删改查、枚举、调用等)。需要动态响应新增/删除属性。需要完美处理数组响应式。处理大型对象或深度嵌套结构时追求更好的初始化性能。

Lew269的博客 1048

Object.defineProperty 和 proxy 区别

Object.defineProperty 和 proxy 区别

yes_catherine的博客 594

Object.defineproperty()和proxy

数据绑定 “数据绑定”的关键在于监听数据的变化,可是对于这样一个对象:var obj = {value: 1},我们该怎么知道 obj 发生了改变呢? Object.defineProperty ES5 提供了 Object.defineProperty 方法,该方法可以在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。 语法:Object.defineProperty(obj, prop, descriptor) 参数 obj: 要在其上定义属性的对象 prop: 要定义或修改

qq_43569680的博客 1239

Proxy 和 Object.defineProperty 区别

Proxy 和 Object.defineProperty 区别 Proxy 的意思是代理,我一般是叫他拦截器,可以拦截对象上的一个操作。用法如下,通过 new 的方式创建对象,第一个参数是被拦截的对象,第二个参数是对象操作的描述。实例化后返回一个新的对象,当我们对这个新的对象进行操作时就会调用我们描述中对应的方法。 new Proxy(target, { get(target, property) { }, set(target, property) { },

3w先生的博客 1409

Object.defineProperty 和 Proxy 区别,及vue3为什么采用新的Proxy

Vue3.0 中,响应式数据部分弃用了Object.defineProperty,使用Proxy来代替它。本文将主要通过以下三个方面来分析为什么 Vue 选择弃用Object.defineProperty。 1.Object.defineProperty真的无法监测数组下标的变化吗? 2. 分析 Vue2.x 中对数组Observe部分源码。 3. 对比Object.defineProperty和Proxy。 无法监控到数组下标的变化? 在一些技术博客上,我看到过这样一种...

QueerUncle的博客 1638

Object.defineProperty 和 Proxy 区别

bject.defineproperty 用于 监听 对象的数据变化 用法 Object.defineproperty(obj, key, descriptor) 例如: let obj = { age: 11 } let val = 1 Object.defineproperty(obj, 'name', { get() { return...

包磊磊的博客 2364

ES6之Object.defineProperty 和 Proxy 区别

1、Object.defineproperty 用于监听对象的数据变化 语法: Object.defineproperty(obj, key, descriptor) let obj = { age: 11 } let value = 'xiaoxiao'; //defineproperty有gettter和setter Object.defineproperty(obj, 'name',...

weixin_40736319的博客 2471
上一篇: github 中使用 ssh
下一篇: RT-Thread Smart 用户态开发体验
ErikChan.hk
博客等级 码龄12年 107粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值