数据劫持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进行解决
目录
相关文章
|
1月前
|
域名解析 网络协议 安全
什么是DNS劫持攻击以及如何避免此类攻击
【10月更文挑战第28天】DNS劫持攻击是一种网络攻击方式,攻击者通过篡改用户的DNS设置,将合法网站的域名解析为恶意网站的IP地址,使用户在不知情的情况下访问钓鱼网站。攻击手段包括在用户系统植入恶意软件、利用路由器漏洞或破解DNS通信等。为防止此类攻击,应使用安全软件、定期检查DNS设置、重置路由器密码及避免访问不安全的网站。
123 1
|
2月前
|
网络协议 安全 网络安全
流量劫持常见的攻击场景
流量劫持常见的攻击场景
34 1
|
5月前
|
JavaScript 安全 网络协议
记一次典型的网站劫持
最近接到一个朋友的求助,他的网站被封了,让我帮忙看看。网站是托管在某云平台的,云平台给出的原因是网站涉赌。这就是个最简单网站,几乎全是静态网页,没什么内容,怎么会涉赌呢?难道是云平台搞错了?
43 1
记一次典型的网站劫持
|
7月前
|
监控 安全 网络安全
什么是劫持检查,劫持检测意义是什么
什么是劫持检查,劫持检测意义是什么
|
前端开发 安全 API
深入了解CORS数据劫持漏洞
1.1. CORS介绍 CORS(跨源资源共享)是一种用于在Web应用程序中处理跨域请求的机制。当一个Web应用程序在浏览器中向不同的域(源)发起跨域请求时,浏览器会执行同源策略,限制了跨域请求的默认行为。同源策略要求Web应用程序只能访问与其本身源(协议、域名和端口)相同的资源。 然而,在某些情况下,我们希望允许来自其他源的跨域请求,例如使用AJAX进行跨域数据访问或在前端应用程序中嵌
140 0
|
域名解析 Web App开发 缓存
教懂你什么是 “ 流量劫持 ”
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
教懂你什么是 “ 流量劫持 ”
|
小程序 C++
【C/C++教学】劫持?劫持?劫持?!!!(二)
【C/C++教学】劫持?劫持?劫持?!!!
211 0
【C/C++教学】劫持?劫持?劫持?!!!(二)
|
SQL API C++
【C/C++教学】劫持?劫持?劫持?!!!(一)
【C/C++教学】劫持?劫持?劫持?!!!
235 0
【C/C++教学】劫持?劫持?劫持?!!!(一)
数据劫持
对属性的读取和修改拦截简单来说就是数据的任何变化都要能监测到,这样才能根据数据变化做对应操作
367 0
数据劫持
|
域名解析 网络协议 安全
流量劫持与防范
流量劫持现象在国内十分猖獗,6家国内顶级互联网公司呼吁有关运营商严格打击流量劫持问题。流量劫持分为域名劫持和内容篡改两类,通过HTTPDNS产品和内容HTTPS加密可以基本解决这两类问题。
560 0