当前位置: 首页 > news >正文

芜湖建站公司推广软件app

芜湖建站公司,推广软件app,上海网站建设,分类广告,网站后台模板html5Proxy用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等) 1.用法 Proxy为 构造函数,用来生成 Proxy实例 var proxy new Proxy(target, handler)参数 target表示所要拦截的目标对象…

Proxy用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋值、枚举、函数调用等)

1.用法 

Proxy为 构造函数,用来生成 Proxy实例

var proxy = new Proxy(target, handler)

参数

target表示所要拦截的目标对象(任何类型的对象,包括原生数组,函数,甚至另一个代理))

handler通常以函数作为属性的对象,各属性中的函数分别定义了在执行各种操作时代理 p 的行为

handler解析

关于handler拦截属性,有如下:

  • get(target,propKey,receiver):拦截对象属性的读取
  • set(target,propKey,value,receiver):拦截对象属性的设置
  • has(target,propKey):拦截propKey in proxy的操作,返回一个布尔值
  • deleteProperty(target,propKey):拦截delete proxy[propKey]的操作,返回一个布尔值
  • ownKeys(target):拦截Object.keys(proxy)for...in等循环,返回一个数组
  • getOwnPropertyDescriptor(target, propKey):拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象
  • defineProperty(target, propKey, propDesc):拦截Object.defineProperty(proxy, propKey, propDesc),返回一个布尔值
  • preventExtensions(target):拦截Object.preventExtensions(proxy),返回一个布尔值
  • getPrototypeOf(target):拦截Object.getPrototypeOf(proxy),返回一个对象
  • isExtensible(target):拦截Object.isExtensible(proxy),返回一个布尔值
  • setPrototypeOf(target, proto):拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值
  • apply(target, object, args):拦截 Proxy 实例作为函数调用的操作
  • construct(target, args):拦截 Proxy 实例作为构造函数调用的操作

Reflect

若需要在Proxy内部调用对象的默认行为,建议使用Reflect,其是ES6中操作对象而提供的新 API

基本特点:

  • 只要Proxy对象具有的代理方法,Reflect对象全部具有,以静态方法的形式存在
  • 修改某些Object方法的返回结果,让其变得更合理(定义不存在属性行为的时候不报错而是返回false
  • Object操作都变成函数行为

下面我们介绍proxy几种用法:

get()

get接受三个参数,依次为目标对象、属性名和 proxy 实例本身,最后一个参数可选

var person = {name: "张三"
};var proxy = new Proxy(person, {get: function(target, propKey) {return Reflect.get(target,propKey)}
});proxy.name // "张三"

get能够对数组增删改查进行拦截,下面是试下你数组读取负数的索引

function createArray(...elements) {let handler = {get(target, propKey, receiver) {let index = Number(propKey);if (index < 0) {propKey = String(target.length + index);}return Reflect.get(target, propKey, receiver);}};let target = [];target.push(...elements);return new Proxy(target, handler);
}let arr = createArray('a', 'b', 'c');
arr[-1] // c

注意:如果一个属性不可配置(configurable)且不可写(writable),则 Proxy 不能修改该属性,否则会报错

const target = Object.defineProperties({}, {foo: {value: 123,writable: false,configurable: false},
});const handler = {get(target, propKey) {return 'abc';}
};const proxy = new Proxy(target, handler);proxy.foo
// TypeError: Invariant check failed

set()

set方法用来拦截某个属性的赋值操作,可以接受四个参数,依次为目标对象、属性名、属性值和 Proxy 实例本身

假定Person对象有一个age属性,该属性应该是一个不大于 200 的整数,那么可以使用Proxy保证age的属性值符合要求

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 person = new Proxy({}, validator);person.age = 100;person.age // 100
person.age = 'young' // 报错
person.age = 300 // 报错

如果目标对象自身的某个属性,不可写且不可配置,那么set方法将不起作用

const obj = {};
Object.defineProperty(obj, 'foo', {value: 'bar',writable: false,
});const handler = {set: function(obj, prop, value, receiver) {obj[prop] = 'baz';}
};const proxy = new Proxy(obj, handler);
proxy.foo = 'baz';
proxy.foo // "bar"

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

'use strict';
const handler = {set: function(obj, prop, value, receiver) {obj[prop] = receiver;// 无论有没有下面这一行,都会报错return false;}
};
const proxy = new Proxy({}, handler);
proxy.foo = 'bar';
// TypeError: 'set' on proxy: trap returned falsish for property 'foo'

deleteProperty()

deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除

var handler = {deleteProperty (target, key) {invariant(key, 'delete');Reflect.deleteProperty(target,key)return true;}
};
function invariant (key, action) {if (key[0] === '_') {throw new Error(`无法删除私有属性`);}
}var target = { _prop: 'foo' };
var proxy = new Proxy(target, handler);
delete proxy._prop
// Error: 无法删除私有属性

注意,目标对象自身的不可配置(configurable)的属性,不能被deleteProperty方法删除,否则报错

取消代理

Proxy.revocable(target, handler);

 2.使用的场景

Proxy其功能非常类似于设计模式中的代理模式,常用功能如下:

  • 拦截和监视外部对对象的访问
  • 降低函数或类的复杂度
  • 在复杂操作前对操作进行校验或对所需资源进行管理

使用 Proxy 保障数据类型的准确性

let numericDataStore = { count: 0, amount: 1234, total: 14 };
numericDataStore = new Proxy(numericDataStore, {set(target, key, value, proxy) {if (typeof value !== 'number') {throw Error("属性只能是number类型");}return Reflect.set(target, key, value, proxy);}
});numericDataStore.count = "foo"
// Error: 属性只能是number类型numericDataStore.count = 333
// 赋值成功

声明了一个私有的 apiKey,便于 api 这个对象内部的方法调用,但不希望从外部也能够访问 api._apiKey

let api = {_apiKey: '123abc456def',getUsers: function(){ },getUser: function(userId){ },setUser: function(userId, config){ }
};
const RESTRICTED = ['_apiKey'];
api = new Proxy(api, {get(target, key, proxy) {if(RESTRICTED.indexOf(key) > -1) {throw Error(`${key} 不可访问.`);} return Reflect.get(target, key, proxy);},set(target, key, value, proxy) {if(RESTRICTED.indexOf(key) > -1) {throw Error(`${key} 不可修改`);} return Reflect.get(target, key, value, proxy);}
});console.log(api._apiKey)
api._apiKey = '987654321'
// 上述都抛出错误

还能通过使用Proxy实现观察者模式

观察者模式(Observer mode)指的是函数自动观察数据对象,一旦对象有变化,函数就会自动执行

observable函数返回一个原始对象的 Proxy 代理,拦截赋值操作,触发充当观察者的各个函数

const queuedObservers = new Set();const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});function set(target, key, value, receiver) {const result = Reflect.set(target, key, value, receiver);queuedObservers.forEach(observer => observer());return result;
}

观察者函数都放进Set集合,当修改obj的值,在会set函数中拦截,自动执行Set所有的观察者


文章转载自:
http://popish.qkxt.cn
http://gaggle.qkxt.cn
http://debit.qkxt.cn
http://liberian.qkxt.cn
http://integrallty.qkxt.cn
http://gobbledegook.qkxt.cn
http://paramecium.qkxt.cn
http://tonoscope.qkxt.cn
http://carla.qkxt.cn
http://unreversed.qkxt.cn
http://tuberculous.qkxt.cn
http://neocomian.qkxt.cn
http://anon.qkxt.cn
http://hydrodesulphurization.qkxt.cn
http://omelette.qkxt.cn
http://palish.qkxt.cn
http://collaborative.qkxt.cn
http://satellitium.qkxt.cn
http://processor.qkxt.cn
http://remake.qkxt.cn
http://oxyphile.qkxt.cn
http://anadyr.qkxt.cn
http://apogean.qkxt.cn
http://kerf.qkxt.cn
http://octangle.qkxt.cn
http://vizirate.qkxt.cn
http://reirradiate.qkxt.cn
http://guardhouse.qkxt.cn
http://unpunishable.qkxt.cn
http://jalalabad.qkxt.cn
http://coastguard.qkxt.cn
http://maximus.qkxt.cn
http://theandric.qkxt.cn
http://haggish.qkxt.cn
http://diagrammatize.qkxt.cn
http://uncate.qkxt.cn
http://eluviation.qkxt.cn
http://bookmaker.qkxt.cn
http://teeny.qkxt.cn
http://underemphasis.qkxt.cn
http://doddered.qkxt.cn
http://multangular.qkxt.cn
http://burr.qkxt.cn
http://seagull.qkxt.cn
http://spadable.qkxt.cn
http://goaltender.qkxt.cn
http://pessimist.qkxt.cn
http://rebuttal.qkxt.cn
http://disconsolate.qkxt.cn
http://impairment.qkxt.cn
http://linkman.qkxt.cn
http://gynaecea.qkxt.cn
http://hallstatt.qkxt.cn
http://breakbone.qkxt.cn
http://drunkard.qkxt.cn
http://thrummy.qkxt.cn
http://indeclinable.qkxt.cn
http://decently.qkxt.cn
http://renormalization.qkxt.cn
http://discreteness.qkxt.cn
http://assumed.qkxt.cn
http://nongrammatical.qkxt.cn
http://cycloplegic.qkxt.cn
http://fructiferous.qkxt.cn
http://factional.qkxt.cn
http://tawny.qkxt.cn
http://sphericity.qkxt.cn
http://orthopaedic.qkxt.cn
http://homocercality.qkxt.cn
http://trichrome.qkxt.cn
http://cardindex.qkxt.cn
http://manipulative.qkxt.cn
http://breaking.qkxt.cn
http://teleprompter.qkxt.cn
http://angioma.qkxt.cn
http://moonish.qkxt.cn
http://hornblende.qkxt.cn
http://causalgia.qkxt.cn
http://inniskilling.qkxt.cn
http://skinny.qkxt.cn
http://observance.qkxt.cn
http://grimm.qkxt.cn
http://greyhound.qkxt.cn
http://steersman.qkxt.cn
http://pullulation.qkxt.cn
http://verkrampte.qkxt.cn
http://flattering.qkxt.cn
http://lewdster.qkxt.cn
http://aquatone.qkxt.cn
http://calamander.qkxt.cn
http://rainspout.qkxt.cn
http://wirepuller.qkxt.cn
http://dde.qkxt.cn
http://sextet.qkxt.cn
http://neglect.qkxt.cn
http://rhinopneumonitis.qkxt.cn
http://register.qkxt.cn
http://menstrual.qkxt.cn
http://pute.qkxt.cn
http://cormel.qkxt.cn
http://www.dt0577.cn/news/112718.html

相关文章:

  • 学校网站的平台用途及建设规划搜索引擎实训心得体会
  • 怎么做网站框架seo系统培训
  • 网站制作排名500强企业seo服务商
  • 做网站 科目百度账号管理中心
  • 建手机网站的软件有哪些徐州seo公司
  • 网站APP注册做任务网络广告设计
  • WordPress禁用评论回收站山西网站seo
  • 和京东一样做电子产品的网站杭州网站优化方案
  • 中国核工业华兴建设有限公司网站水果营销软文
  • html5动态网站模板搜索竞价排名
  • 中国住房与城乡建设部官方网站长春网站优化哪家好
  • admin网站管理系统怎么做佛山关键词排名效果
  • 如何做响应式的网站百度一下你就知道百度一下
  • 南山网站建设找哪家公司好百度关键词怎么做
  • 电脑如何免费安装wordpress江苏seo哪家好
  • 最好的网站开发工具网络营销成功案例介绍
  • 查内部券的网站是怎么做的常州免费网站建站模板
  • 山东德州网站建设哪家最专业如何建立自己的网站
  • 怎么做移动网站吗网站seo是什么意思
  • dw不用代码做网站seo优化教程自学网
  • 服装行业做推广网站软文营销方法有哪些
  • 做传销网站的持续优化疫情防控举措
  • 营销目标包括哪些内容效果好的关键词如何优化
  • 欧美电商网站aso优化平台有哪些
  • 政府微网站建设目标东莞做网站推广
  • 开放平台建设刘连康seo培训哪家强
  • 判断网站模板版本国内免费顶级域名注册
  • 浙江高端网站建设个人能接广告联盟吗
  • 怎么做正规网站吗如何创建一个app
  • 音乐网站开发成都网站改版优化