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高级程序设计阅读收获(9.3)——代理模式 -> 正文阅读

[JavaScript知识库]javascript高级程序设计阅读收获(9.3)——代理模式

1.跟踪属性访问

const user = {
	name: 'Jake'
};

const proxy = new Proxy(user,{
	get(target,property,receiver){
		console.log(`Getting ${property}`);
		return Reflect.get(...arguments);
	},
	set(target,property,value,receiver){
		console.log(`Setting ${property} = ${value}`);
		return Reflect.set(...arguments);
	}
});

proxy.name;//Getting name
proxy.age = 27;//Setting age = 27
  1. 通过get、set和has等操作,可以知道对象属性什么时候被访问、被查询。把实现相应捕获器的某个对象代理到应用中,可以监控这个对象何时在何处被访问过。

2.隐藏属性

const hiddenProperties = ['foo','bar'];
const targetObject = {
	foo: 1,
	bar: 2,
	baz: 3
};
const proxy = new Proxy(targetObject,{
	get(target,property){
		if(hiddenProperties.includes(property)){
			return undefined;
		}else{
			return Reflect.get(...arguments);
		}
	},
	has(target,property){
		if(hiddenProperties.includes(property)){
			return false;
		}else{
			return Reflect.has(...arguments);
		}
	}
});

console.log(proxy.foo);//undefined
console.log(proxy.bar);//undefined
console.log(proxy.baz);//3

console.log('foo' in proxy)//false
console.log('bar' in proxy)//false
console.log('baz' in proxy)//true
  1. 代理的内部实现对外部代码是不可见的,因此要隐藏目标对象上的属性也轻而易举。

3.属性验证

const target = {
	onlyNumbersGoHere:0
};
const proxy = new Proxy(target,{
	set(target,property,value){
		if(typeof value !== 'number'){
			return false;
		}else{
			return Reflect.set(...arguments);
		}
	}
});

proxy.onlyNumberGoHere = 1;
console.log(proxy.onlyNumbersGoHere);//1
proxy.onlyNumbersGoHere = '2';
console.log(proxy.onlyNumbersGoHere);//1

1.因为所有赋值操作都会触发set捕获器,所以可以根据所赋的值决定是允许还是拒绝赋值。

4.函数与构造函数参数验证

function median(...nums){
	return nums.sort()[Math.floor(nums.length/2)];
}

const proxy = new Proxy(median,{
	apply(target,thisArg,argumentsList){
		for(const arg of argumentsList){
			if(typeof arg !== 'number'){
				throw 'Non-number argument provided'
			}
		}
		return Reflect.apply(...arguments);
	}
})

console.log(proxy(4,7,1));//4
console.log(proxy(4,'7',1));//Error:Non-number argument provided
  1. 跟保护和验证对象属性类似,也可对函数和构造函数参数进行审查。比如,可以让函数只接收某种类型的值。
class User{
	constructor(id){
		this._id = id;
	}
}

const proxy = new Proxy(User,{
	construct(target,argumentsList,newTarget){
		if(atgumentsList[0] === undefined){
			throw 'User cannot be instantiated without id';
		}else{
			return Reflect.construct(...arguments);
		}
	}
});
new proxy(1);
new proxy();
  1. 可以要求实例化时必须给构造函数传参

5.数据绑定与可观察对象

const userList = [];
class User{
	constructor(name){
		this.name_ = name;
	}
}

const proxy = new Proxy(User,{
	construct(){
		const newUser = Reflect.construct(...arguments);
		userList.push(newUser);
		return newUser;
	}
});

new proxy('John');
new proxy('Jacob');
new proxy('Jingleheimerschmidt');

console.log(userList);//[User {name_: "John"},User {name_: "Jacob"},User {name_: "Jingleheimerschmidt"}]
  1. 通过代理可以把运行中原本不相关的部分联系到一起。这样就可以实现各种模式,从而让不同的代码互相操作。
const userList = [];
function emit(newValue){
	console.log(newValue);
}

const proxy = new Proxy(userList,{
	set(target,property,value,receiver){
		const result = Reflect.set(...arguments);
		if(result){
			emit(Reflect.get(target,property,receiver));
		}
		return result;
	}
});

proxy.push('John');//John
proxy.push('Jacob');//Jacob
  1. 可以把集合绑定到一个事件分派程序,每次插入新实例时都会发送消息。
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:31:55  更:2021-08-06 09:34:28 
 
开发: 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年5日历 -2024/5/16 2:37:13-

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