Object.defineProperty和Proxy

Windows中的TLS 1.2启用方法(IIS、C#、.Net framework) 折腾几天了windows中的tls1.2启用方法!特此记录一下 开发背景: 在一个用.net framework 2.0开发的客户端程序里面嵌入功能调用第三方物联网相关接口,服务器上有一个restful接口用于接收第三方上报的数据及处理,最后再调用第三方的物联网相关接口。本机开发环境Windows 10,客户服务器是Windows Server 2008 R2。 第一次写这种物联网相关的接口调用,而且第三方提供的文档比较简单,最基本的报文示例都没。开发环境里面各种摸索一步一个坑,首先在发送HTTP请求前 阅读详情

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都能很好的监听到变化。

告别GitHub!手把手教你用Gitblit在Windows 10上搭建私人局域网Git服务器(附SourceTree配置) 本文详细介绍了如何在Windows 10环境下使用Gitblit搭建私有Git服务器,实现局域网内高效代码协作。通过轻量级的Gitblit解决方案,开发者可以享受数据完全自主、离线可用性和局域网高速访问等优势。文章包含从环境准备、安装部署到SourceTree配置的全流程指南,特别适合金融、医疗等敏感行业团队使用。 阅读详情

相关推荐

Win11 24H2共享访问被禁?深入聊聊SMB签名和‘不安全的来宾登录’那点事

本文深入解析Win11 24H2共享访问故障,探讨SMB签名的安全机制与‘不安全的来宾登录’问题。提供从注册表修改到组策略配置的多层次解决方案,特别针对家庭网络和打印机共享场景给出实用建议,帮助用户在安全与便利之间找到平衡。

weixin_42556197的博客 565

Object.defineproperty方法(详解)

Object.defineproperty方法(详解)

weixin_57677300的博客 2万+

手把手带你搭建一个语音对话机器人:5分钟定制个人AI小助手

通过本文的简单步骤,你已经掌握了如何用 Python 搭建一个语音对话机器人。我们使用了实现语音识别,利用 OpenAI API 生成对话内容,并通过gTTS将文本转换为语音。整个流程非常简洁,你可以根据自己的需求进一步扩展机器人功能,甚至将其集成到实际的应用场景中。

小蜗牛的珍贵百宝箱 4805

Object.defineProperty详解

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

曹定栓的博客 9954

jason-2卫星介绍及其数据下载

两台仪器发射脉冲宽度均为105.6μs,带宽320MHz(C频段)和320/100MHz(Ku频段),脉冲重复频率1800Hz(Ku频段)和300Hz(C频段),功率78W,数据传输速率22.5kbit/s。共发射了3颗卫星(Jason - 1/2/3),星上有效载荷均主要为雷达高度计和微波辐射计。Jason - 1卫星主要有效载荷为波塞冬 - 2和“贾森微波辐射计”,Jason - 2卫星进行了改进,主要携带了波塞冬 - 3和先进微波辐射计,此外,Jason - 2卫星还携带了“多里斯”系统。

beautyaaaa的博客 1606

基于单片机电能质量检测仪设计

*单片机设计介绍,基于单片机电能质量检测仪设计。

2201_75940997的博客 1205

Object.defineproperty

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

书中自有妍如玉的博客 3172

游戏封包抓取实战:雷电模拟器+ProxyDroid+查尔斯3.93+WPE全流程解析

本文详细解析了使用雷电模拟器、ProxyDroid、查尔斯3.93和WPE进行游戏封包抓取的全流程实战。通过环境搭建、代理配置与工具协同,手把手教你抓取HTTP/HTTPS及原始Socket数据,涵盖从流量转向、证书安装到数据分析和常见问题排查,是学习游戏网络协议分析与安全测试的实用指南。

u8v9w0x1y的博客 445

【JS】Object.defineProperty与Proxy

【JS】Object.defineProperty与Proxy

owo_ovo的博客 2129

Mac 安装neo4j(解压版)最新版本教程

本文介绍了在Mac M系列操作系统上安装Neo4j图数据库的具体步骤。内容包括:从官网下载解压版Neo4j社区版压缩包;通过终端命令将其解压到/opt目录并重命名;配置环境变量以便全局访问;以及常用命令如启动/停止服务、重置密码等。安装完成后,用户可通过浏览器访问http://localhost:7474,使用默认账号neo4j/neo4j登录并根据提示重置密码。该教程简洁明了地指导用户完成Neo4j在Mac上的安装配置过程。

猿小白的博客 909

WEB浏览器视频流播放方案

基于Media Source Extensions播放视频流 浏览器播放视频的几种方法 一、H5 video标签 在浏览器播放视频,可以使用HTML5原生的video标签。但其播放的格式使用一定限制的,目前video只支持三种格式WebM、Ogg、MP4。 WebM:WebM 文件使用 VP8 视频编解码器和 Vorbis 音频编解码器 Ogg :Ogg 文件使用 Theora 视频编解码器和 Vorbis音频编解码器 MP4: MPEG 4文件使用 H264 视频编解码器和AAC音频编解码器 上面三种

machh的专栏 2381

Object.defineProperty和Proxy区别

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

Mybells 1万+

Allegro层叠中的介电常数如何填写指导说明

在用Allegro进行PCB设计的时候,需要在cross-section中设置好每个层的信息,包括层命名,每层的厚度等等信息。但是对于有仿真需求或者等长设计需要使用ps作为延时单位的设计的时候,需要额外在层叠中填写介电常数的值,如下图。按照经验值填写为2.8,因为外层和平面层不会被树脂填充,铜皮层还是完整的铜皮,如下图。对应层叠将每层介质的介电常数的数值填入到PCB中去,油墨的介电常数填4。层叠中只给出了每个介质的介电常数,铜皮的介电常数却没有给出。所以正确填写介电常数的结果如下图。需要按照下面的规则来。

weixin_54787054的博客 1392

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

IEM模型,地表粗糙度模拟

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

object.defineProperty和proxy、nextTick

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

weixin_45392204的博客 986

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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、付费专栏及课程。

余额充值