数据被劫持的那些年(defineProperty的参数及解释)

在之前的一道可能是面试题的题中,我们有提到过一些数据劫持的东西,但有些朋友可能并不了解这些东西,所以本次就做了一次较详细的讲解

一、什么是defineProerty

1.翻译

首先我们先进行翻译,通过翻译我们可以大致了解这个词的意思

dufine:定义

property:属性

简单理解就是可以在一个对象上定义一个新属性,或者修改一个对象的现有属性,并且会返回这个对象(即返回值是对象形式)

2.语法

Object.defineProperty(obj, propperty, descriptor)

3.参数

obj:要绑定属性的目标对象

property:绑定的属性名

descriptor:配置项(对象形式)

个人对defineProperty的理解就是property属性已被劫持,这时你想要使用property这个属性,劫匪会做出相应的反应

二、descriptor的属性值

在这个对象类型的属性中又包括了大致六种属性值

1.value

设置属性默认值,默认为undefined

2.writable

设置属性是否能被修改,默认是不可修改(false)

3.enumerable

属性是否可以被枚举,即是否能被遍历,默认为不可遍历(false)

4.configurable

设置属性是否可以修改或删除,默认为不可修改和删除(false)

5.get

获取属性是要执行的操作

6.set

设置属性要执行的操作

以上则是descriptor的属性值,这写属性值并不是必须全部出现的

三、属性值的解释

准备:

首先我们先做一下准备工作

let obj = {
    a: 1,
    b: 2
}
let obj1 = {}

1.value的使用

value可以给对象设置一个属性

Object.property(obj1,'word',{
    value: 'Hello,word'
})
console.log(obj1.word)//'Hello,word'

可以通过遍历动将obj属性添加到obj1中

for(let i in obj) {
    Object.definedProperty(obj1, i, {
        value: obj[i]
    })
}
console.log(obj1)//{a:1, b:2}

2.writable的使用

writable为true时可以改变属性值

可以结合value实现对象的深拷贝

for(let i in obj) {
    Object.defineProperty(obj1, i,{
        value: obj[i],
        writable: true
    })
}
obj1.b = 3
console.log(obj)//{a:1,b:2}
console.log(obj2)//{a:1,b:3}

3.enumerable的使用

for(let i in obj) {
    Object.definedProperty(obj1,i,{
        value:obj[i],
        writable:true,
        enumerable:false
    })
}
//此时去遍历obj1
for(let x in obj1) {
    console.log(x)
}
//会发现并没有去遍历,

4.configurable的值为false

for(let x in obj) {
    Object.definedProperty(obj1, x,{
        value: obj[i],
        writable: true,
        emumerable: false,
        configurable: true
    })
}
delete obj1.a    //删除a这个属性
console.log(obj1)//会发现a属性并未被删除

5.get的值为一个函数

Object.difineProperty(obj, a, {
    get() {
        return 3
    }
})
console.log(obj.a)//3

get的作用是在当你获取对象中被劫持的那个属性值时,获取的值为get方法所返回的值

并且此时打印obj发现里面并没有a这个属性值了

注:get方法中并没有参数

6.set的值同样也是一个函数

set的作用是在修改对象中被劫持的属性值时,调用set方法中的函数,set方法中有一个参数,参数为所修改的值,具体用法如下

Object.defineProperty(obj,'a',{
    set(val) {
        console.log(val)//打印结果为3
    }
})
obj.a = 3//此时会调用set方法的函数

那么以上便是此次对defineProperty的介绍了,本次干货较多

有问题可以私信或评论啊

另外,可以根据此次内容写一个原生的call(修改this指向的方法)

  • 19
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在Vue 3中,可以使用`ref`和`reactive`创建响应式对象。如果想要使用`Proxy`来获取目标数据,可以这样做: 1. 创建一个`reactive`对象,该对象将作为代理对象: ``` import { reactive } from 'vue'; const target = { foo: 'bar', baz: { qux: 'quux' } }; const proxy = reactive(target); ``` 2. 使用`Proxy`访问目标对象的属性。例如,如果想要获取`target`对象的`foo`属性,可以这样做: ``` const handler = { get(target, key) { console.log(`getting ${key}`); return target[key]; } }; const proxy = new Proxy(target, handler); console.log(proxy.foo); // "bar" ``` 这将输出`getting foo`,然后返回`"bar"`。 注意,为了让`Proxy`能够代理`reactive`对象,需要在`handler`对象中实现`get`方法。`get`方法接收两个参数:目标对象和属性名。在该方法中,可以访问目标对象的属性并返回它们的值。 ### 回答2: Vue3中的Proxy是一种新的对象代理方式,在处理数据的过程中,可以为已有对象提供一个代理层,从而达到对该对象进行一定程度的控制和管理的目的,可以实现一些复杂的数据操作和效果实现。 Proxy获取target数据的基本方法为:在创建Proxy对象时传入一个target对象,然后通过访问Proxy对象的属性或调用其方法来实现对target对象属性的访问和操作。 例如: ```javascript const target = { name: 'Tom', age: 18, gender: 'male' } const handler = { get(target, key, receiver) { console.log(`Getting ${key} value from target`); return Reflect.get(target, key, receiver); }, set(target, key, value, receiver) { console.log(`Setting ${key} value to target`); return Reflect.set(target, key, value, receiver); } }; const proxy = new Proxy(target, handler); console.log(proxy.name); // Output: Getting name value from target, Tom proxy.age = 25; // Output: Setting age value to target ``` 在以上代码中,我们定义了一个target对象和一个handler对象,然后用这两个对象创建了一个代理proxy对象。handler中, get和set是拦截器,可以打印出数据读取和修改的日志信息。 我们通过proxy对象访问了target对象中的name属性,此时就会触发get方法,打印出获取属性值的日志信息,最终返回了target对象中的name属性的值' Tom',同理,我们通过proxy.age = 25操作,也会触发set方法,在控制台中打印出设置属性值的信息。 以上是简单的Proxy获取target数据的基本方法,这种代理方式可以用在很多场景中,例如对数据进行拦截、监视和修改,实现复杂的业务逻辑等。Vue3也广泛使用Proxy来实现数据劫持,实现了数据绑定的效果。 ### 回答3: Vue 3中的Proxy是一种高级JavaScript特性,可以用来代理/拦截目标对象的行为。在Vue中,我们通常使用Proxy来监听数据的变化并触发视图更新。Proxy有一个非常强大的特性:可以通过get/set等方法获取并处理目标数据,这使得我们可以更加灵活地操作数据,并实现类似Vue2中的Object.defineProperty的效果。 在使用Proxy获取目标数据时,需要注意以下几点: 1. 创建Proxy对象时需要传入一个目标对象 创建Proxy对象时需要传入一个目标对象作为参数,即将要被代理的对象。在Vue中,通常是将data对象作为目标对象,然后使用Proxy来监听其变化。 2. 在get方法中获取目标数据 在Proxy对象中使用get方法来获取目标数据。当我们获取目标数据时,Proxy会触发get方法,并传入两个参数:目标对象和要获取的属性名。我们可以在get方法中获取目标属性的值,并对其进行处理。 3. 在set方法中更新目标数据 除了使用get方法来获取目标数据,我们还可以使用set方法来更新目标数据。当我们使用Vue中的双向绑定语法时,会自动调用set方法更新数据。在set方法中,我们可以获取目标属性的值并对其进行修改,然后再将修改后的数据返回,Proxy会自动更新目标对象的数据。 总之,Vue 3中的Proxy能够帮助我们更加灵活地处理数据,充分发挥Vue框架的优势,实现更加高效,智能的前端开发
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值