IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> JavaScript的Proxy代理 -> 正文阅读

[JavaScript知识库]JavaScript的Proxy代理

proxy代理,就是在目标对象的前面设置一个拦截层,外界在访问这个对象的时候,必须经过拦截层。
我们可以在拦截层做一些过滤或者是改写的操作。

const proxy = new Proxy({}, {
    get: () => {
        console.log("get");
    },
    set: () => {
        console.log("set")
    }
})

proxy.count = 1; // set
++proxy.count; // get

Proxy接受两个参数,第一个参数是拦截目标对象;第二个参数是设置拦截的操作,所谓的拦截,一般都是有一些操作行为的,如果在拦截层没有设置任何操作的话,就会直接访问目标对象。

Proxy支持的拦截操作

get(target,propkey,receiver)

拦截对象的读取属性操作。

const proxy = new Proxy({ name: "duXin", count: 90 }, {
    get: () => {
        console.log("get");
        return 100
    },
})

console.log(proxy.name)

在访问目标对象的时候,无论是name属性还是count属性,都会返回100,因为在拦截层设置读取属性时都返回100。

set()

方法是设置属性值操作的捕获器。

const proxy_set = new Proxy({}, {
    set: function (target, prop, value, receiver) {
        target[prop] = value;
        console.log('property set: ' + prop + ' = ' + value);
        return true;
    }
})

console.log("======proxy_set=======")
console.log('name' in proxy_set); // false
proxy_set.name = 'duXin'; // property set: name = duXin

console.log('name' in proxy_set); // true
has()

对in操作符的代理方法。

const targetObj = {
    _secret: 'easily scared',
    eyeCount: 4
};
const proxy_has = new Proxy(targetObj, {
    has: (target, key) => {
        console.log("key==",key)
        if (key.includes('_')) {
            return false;
        }
        return key in target;
    }
})

console.log('eyeCount' in targetObj); // true
console.log('_secret' in proxy_has); // false
construct()

拦截new操作符,返回的是一个对象。

function proxy_construct_obj(disposition){
    this.disposition = disposition;
}
const proxyConstruct = new Proxy(proxy_construct_obj, {
    construct: function (target, args) {
        return new target(...args);
    }
})

console.log(new proxyConstruct("duXinYue").disposition)
apply()

拦截函数的调用。
语法:

var p = new Proxy(target, {
  apply: function(target, thisArg, argumentsList) {
  }
});

target:目标对象,也就是函数
thisArg:被调用时的上下文对象
argumentsList:被调用时的参数,是一个类数组。

声明一个函数:

function sum(a, b) {
    return a + b;
}

const proxy_apply = new Proxy(sum, {
    apply: (target,thisArg, argumentsList) => {
        console.log("target",target,thisArg, argumentsList)
        return target(argumentsList[0], argumentsList[1]) * 10;
    }
})

console.log(proxy_apply(1,2)); //30
defineProperty()

拦截对象的 Object.defineProperty() 操作符。
这是语法:
defineProperty: function(target, property, descriptor) {}
target:目标对象,
property:被检索的属性名
descriptor:待定义或者修改的属性的描述符

defineProperty的返回值必须是Boolean值,表示对该属性操作是否成功。

var desc = { configurable: true, enumerable: true, value: 10 };
var defineProperty = new Proxy(desc, {
    defineProperty: function (target, prop, descriptor) {
        console.log('called: ' + prop);
        Reflect.defineProperty(target, prop, descriptor);
    }
});

defineProperty.name = "908"
console.log("obj", defineProperty); // { configurable: true, enumerable: true, value: 10, name: '908' }
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-04 10:57:06  更:2022-02-04 10:57:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:32:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码