您身边的网站建设专家
成功案例

【建站服务】武威设计网页公司-域名申请

日期: 2022-09-21 03:25:08 浏览数:3


上往建站提供服务器空间服务商百度快照排名网站托管百度推广运营,致力于设计外包服务与源代码定制开发360推广搜狗推广,增加网站的能见度及访问量提升网络营销的效果,主营:网站公司,百度推广公司电话,官网搭建服务,网站服务企业排名,服务器空间,英文域名等业务,专业团队服务,效果好。


武威设计网页公司

网站建设.png

概述

Proxy 与 Reflect 是 ES6 为了操作对象引入的 API 。

Proxy 可以对目标对象的读取、函数调用等操作进行拦截,然后进行操作处理。它不直接操作对象,而是像代理模式,通过对象的代理对象进行操作,在进行这些操作时,可以添加一些需要的额外操作。

Reflect 可以用于获取目标对象的行为,它与 Object 类似,但是更易读,为操作对象提供了一种更优雅的方式。它的方法与 Proxy 是对应的。


基本用法

Proxy

一个 Proxy 对象由两个部分组成: target 、 handler 。在通过 Proxy 构造函数生成实例对象时,需要提供这两个参数。 target 即目标对象, handler 是一个对象,声明了代理 target 的指定行为。

let target = {    name: 'Tom',    age: 24}let handler = {    get: function(target, key) {        console.log('getting '+key);        return target[key]; // 不是target.key    },    set: function(target, key, value) {        console.log('setting '+key);        target[key] = value;    }}let proxy = new Proxy(target, handler)proxy.name     // 实际执行 handler.getproxy.age = 25 // 实际执行 handler.set// getting name// setting age// 25 // target 可以为空对象let targetEpt = {}let proxyEpt = new Proxy(targetEpt, handler)// 调用 get 方法,此时目标对象为空,没有 name 属性proxyEpt.name // getting name// 调用 set 方法,向目标对象中添加了 name 属性proxyEpt.name = 'Tom'// setting name// "Tom"// 再次调用 get ,此时已经存在 name 属性proxyEpt.name// getting name// "Tom" // 通过构造函数新建实例时其实是对目标对象进行了浅拷贝,因此目标对象与代理对象会互相// 影响targetEpt// {name: "Tom"} // handler 对象也可以为空,相当于不设置拦截操



set(target, propKey, value, receiver)

用于拦截 target 对象上的 propKey 的赋值操作。如果目标对象自身的某个属性,不可写且不可配置,那么set方法将不起作用。


let validator = {

    set: function(obj, prop, value) {

        if (prop === 'age') {

            if (!Number.isInteger(value)) {

                throw new TypeError('The age is not an integer');

            }

            if (value > 200) {

                throw new RangeError('The age seems invalid');

            }

        }

        // 对于满足条件的 age 属性以及其他属性,直接保存

        obj[prop] = value;

    }

};

let proxy= new Proxy({}, validator)

proxy.age = 100;

proxy.age           // 100

proxy.age = 'oppps' // 报错

proxy.age = 300     // 报错

第四个参数 receiver 表示原始操作行为所在对象,一般是 Proxy 实例本身。


const handler = {

    set: function(obj, prop, value, receiver) {

        obj[prop] = receiver;

    }

};

const proxy = new Proxy({}, handler);

proxy.name= 'Tom';

proxy.name=== proxy // true

 

const exam = {}

Object.setPrototypeOf(exam, proxy)

exam.name = "Tom"

exam.name === exam // true

注意,严格模式下,set代理如果没有返回true,就会报错。


apply(target, ctx, args)

用于拦截函数的调用、call 和 reply 操作。target 表示目标对象,ctx 表示目标对象上下文,args 表示目标对象的参数数组。


function sub(a, b){

    return a - b;

}

let handler = {

    apply: function(target, ctx, args){

        console.log('handle apply');

        return Reflect.apply(...arguments);

    }

}

let proxy = new Proxy(sub, handler)

proxy(2, 1) 

// handle apply

// 1


武威设计网页公司


上往建站提供搭建网站域名注册官网备案服务网店详情页设计企业网店专业网络店铺管理运营全托管公司咨询电话,服务器空间,微信公众号托管网页美工排版,致力于域名申请竞价托管软文推广全网营销,提供标准级专业技术保障,了却后顾之忧,主营:虚拟主机网站推广百度竞价托管网站建设上网建站推广服务网络公司有哪些等业务,专业团队服务,效果好。

服务热线:400-111-6878 手机微信同号:18118153152(各城市商务人员可上门服务)


全国咨询热线:400-111-6878

地址:全国各地都有驻点商务

Copyright © 2021 通陆科技

网站建设上往建站