数据劫持2

简介: Reflect和Object来说,框架封装更需要健壮性强的ReflectProxy处理响应式数据更具优势Object.defineProperty那些缺点在vue框架里也提供了相应的api进行解决

### 前言:

-   上一篇讲解了defineProperty方法今天来讲讲proxy

-   vue3中数据劫持使用了proxy主要是因为defineProperty有几项缺点

   -   新增属性,删除属性

   -   直接通过下标修改数组

-   defineProperty缺点讲解

   ```

   //先回顾上期知识点    

      let person = {

           name:'vike',

           age:5

       }

   

       // 回顾上篇defineProperty方法

       let p = {}

       // name属性

       Object.defineProperty(p,'name',{

           get(){

               console.log('读取name属性')

               return person.name

           },

           set(newValue){

               console.log('修改name属性')

               person.name = newValue

           }

       })

       // age属性

       Object.defineProperty(p,'age',{

           get(){

               console.log('读取age属性')

               return person.age

           },

           set(newValue){

               console.log('修改age属性')

前言:

  • 上一篇讲解了defineProperty方法今天来讲讲proxy
  • vue3中数据劫持使用了proxy主要是因为defineProperty有几项缺点
  • 新增属性,删除属性
  • 直接通过下标修改数组
  • defineProperty缺点讲解
//先回顾上期知识点    
   let person = {
        name:'vike',
        age:5
    }
    // 回顾上篇defineProperty方法
    let p = {}
    // name属性
    Object.defineProperty(p,'name',{
        get(){
            console.log('读取name属性')
            return person.name
        },
        set(newValue){
            console.log('修改name属性')
            person.name = newValue
        }
    })
    // age属性
    Object.defineProperty(p,'age',{
        get(){
            console.log('读取age属性')
            return person.age
        },
        set(newValue){
            console.log('修改age属性')
            person.age = newValue
        }
    })

3-1.jpg

  • 新增属性
  • 没有进行数据劫持 不能成为响应式数据

3-2.jpg

  • 删除属性
  • 使用delete关键字删除属性,返回flase。
  • delete 删除会返回true或者flase。删完了为true,删不掉为false
  • 在Object.defineProperty配置项内多加一行configurable:true,即可删除
  • delete删除p上属性不会影响person上的属性,主要原因是无法捕获这个变化

3-3.jpg3-4.jpg

proxy讲解

  • window.Proxy为内置函数
  • 使用实例
let person = {
        name:'vike',
        age:5
    }
    // proxy作用  让p映射person 第一个参数为要映射的对象 第二参数可为空对象占位
    let p = new Proxy(person,{})

3-5.jpg

-   Proxy里的Handler 对属性进行增删改查操作靠这里面的配置
-   Proxy里的Target 属性
    -   取值方法 p.name p.age
-   新增 修改 删除 proxy代理实现

3-6.jpg

-   proxy捕获数据
    ```
     // 源对象
        let person = {
            name:'vike',
            age:5
        }
        // 代理对象
        let p = new Proxy(person,{
            // get 上有两个参数 target是newProxy传入的对象 propName是读取的属性
            // 读取属性触发
            get(target,propName){
                console.log(`读取了${propName}属性`)
                return target[propName]
            },
            // set上新增了newValue属性 修改和新增触发
            set(target,propName,newValue){
                console.log(`修改了${propName}属性`)
                target[propName] = newValue
            },
            // deleteProperty 删除属性触发
            deleteProperty(target,propName) {
                console.log(`删除了${propName}属性`)
                delete target[propName]
            }
        })
    ```

3-7.jpg

-   delete p.name返回false是因为deleteProperty方法没返回,只要`return delete target[propName]`
### Reflect 介绍
-   ES6新增
-   ECMA正尝试把Object上的方法移植到Reflect上

3-8.jpg

-   Reflect方法上也包含defineProperty 且有返回值 true表示成功,false表示失败
    ```
        let person = {
            name:'vike',
            age:5
        }
        let p1 = Reflect.defineProperty(person,'sex',{
            get() {
                return '男'
            }
        })
        let p2 = Reflect.defineProperty(person,'sex',{
            get() {
                return '女'
            }
        })
        console.log(p1,p2)
    ```

3-9.jpg

-   对比Object.defineProperty 会直接报错且不执行下面代码
    ```
        let person = {
            name:'vike',
            age:5
        }
        Object.defineProperty(person,'sex',{
            get() {
                return '男'
            }
        })
        Object.defineProperty(person,'sex',{
            get() {
                return '女'
            }
        })
    ```

3-10.jpg

总结

  • Reflect和Object来说,框架封装更需要健壮性强的Reflect
  • Proxy处理响应式数据更具优势
  • Object.defineProperty那些缺点在vue框架里也提供了相应的api进行解决
目录
相关文章
|
8天前
|
域名解析 网络协议 安全
什么是DNS劫持攻击以及如何避免此类攻击
【10月更文挑战第28天】DNS劫持攻击是一种网络攻击方式,攻击者通过篡改用户的DNS设置,将合法网站的域名解析为恶意网站的IP地址,使用户在不知情的情况下访问钓鱼网站。攻击手段包括在用户系统植入恶意软件、利用路由器漏洞或破解DNS通信等。为防止此类攻击,应使用安全软件、定期检查DNS设置、重置路由器密码及避免访问不安全的网站。
40 1
|
1月前
|
网络协议 安全 网络安全
流量劫持常见的攻击场景
流量劫持常见的攻击场景
|
4月前
|
JavaScript 安全 网络协议
记一次典型的网站劫持
最近接到一个朋友的求助,他的网站被封了,让我帮忙看看。网站是托管在某云平台的,云平台给出的原因是网站涉赌。这就是个最简单网站,几乎全是静态网页,没什么内容,怎么会涉赌呢?难道是云平台搞错了?
41 1
记一次典型的网站劫持
|
6月前
|
JavaScript 前端开发 API
javascrip中的数据劫持与数据代理
javascrip中的数据劫持与数据代理
|
6月前
|
监控 安全 网络安全
什么是劫持检查,劫持检测意义是什么
什么是劫持检查,劫持检测意义是什么
|
前端开发 安全 API
深入了解CORS数据劫持漏洞
1.1. CORS介绍 CORS(跨源资源共享)是一种用于在Web应用程序中处理跨域请求的机制。当一个Web应用程序在浏览器中向不同的域(源)发起跨域请求时,浏览器会执行同源策略,限制了跨域请求的默认行为。同源策略要求Web应用程序只能访问与其本身源(协议、域名和端口)相同的资源。 然而,在某些情况下,我们希望允许来自其他源的跨域请求,例如使用AJAX进行跨域数据访问或在前端应用程序中嵌
132 0
|
域名解析 Web App开发 缓存
教懂你什么是 “ 流量劫持 ”
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
教懂你什么是 “ 流量劫持 ”
|
安全 JavaScript 网络安全
网络安全-点击劫持(ClickJacking)的原理、攻击及防御
网络安全-点击劫持(ClickJacking)的原理、攻击及防御
238 0
网络安全-点击劫持(ClickJacking)的原理、攻击及防御
|
小程序 C++
【C/C++教学】劫持?劫持?劫持?!!!(二)
【C/C++教学】劫持?劫持?劫持?!!!
204 0
【C/C++教学】劫持?劫持?劫持?!!!(二)
|
SQL API C++
【C/C++教学】劫持?劫持?劫持?!!!(一)
【C/C++教学】劫持?劫持?劫持?!!!
228 0
【C/C++教学】劫持?劫持?劫持?!!!(一)