ES6引入的Reflect对象目的何在?
2024-09-07 08:08:29
Reflect对象其实就是为了取代Object对象。取代原因有一下几点:
1)Object对象的一些内部方法放在了Reflect上面,比如:Object.defineProperty。主要是优化了语言内部的方法。
2)修改Object方法的返回,例如:Object.definePropery(obj,name,desc)无法定义属性时报错,而Reflect.definedProperty(obj,name,desc)则会返回false。
3)让Object变成函数的行为,以前的:name in obj和delete obj[name],可以让Reflect.has(name)和Reflect.deleteProperty(obj,name)替代。
4)Reflect方法和Proxy方法一一对应。主要就是为了实现本体和代理的接口一致性,方便用户通过代理操作本体。
ES6提供了Proxy代理对象,不需要开发者自己再去写代理对象的方法,这点很方便,一些代理需求就可以使用Proxy完成,本体的操作可以通过Reflect对象调用。
//定义一个订阅者集合
const queuedObservers = new Set();
//添加订阅者
const observe = fn => queuedObservers.add(fn);
//给对象添加代理对象,代理的set方法中进行遍历订阅者列表
const observable = obj => new Proxy(obj,{set}); function set(target,key,value,receiver){
const result = Reflect.set(target,key,value,receiver);
//遍历订阅者集合,依次触发订阅者方法
queuedObservers.forEach(fn => fn());
//返回订阅者
return result;
} //使用Proxy实现观察者模式[发布-订阅者模式]
const person = observable({name:'张三',age:30}); function print(){
console.log(`${person.name},${person.age}`);
}
function anotherPrint(){
console.log(`你想的很对`)
} //订阅者集合里面加入print订阅者
observe(print);
observe(anotherPrint) person.name = 'miya'
这里实现了一个观察者模式,主要的触发点在对象的set调用后,在代理对象person里面进行观察者方法的触发。
【完】
如果不想动辄就暴露智商
要么多读书要么少说话
最新文章
- SQLSERVER2008 R2安装说明
- oracle笔记
- LR12.53—第1课:构建Vuser脚本
- js整理3
- iOS单例的作用和使用
- c语言二叉树基本操作
- C# WinForm 中Console 重定向输出到ListBox控件中显示
- Vijos 1180 (树形DP+背包)
- Hadoop1.x与2.x安装笔记
- [CODEVS1697]⑨要写信
- HDU5778 abs
- jQuery选择器(适合初学者哟....)
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(6)-Unity 2.x依赖注入by运行时注入[附源码]
- python request的运用
- Redis安装及简单測试
- hdu 2149 Public Sale 简单博弈
- 获取CPU系列号,硬盘系
- 简单ATM系统
- Url解码和编码 escape()、encodeURI()、encodeURIComponent()区别详解
- Error when Building GPU docker image for caffe: Unsupported gpu architecture 'compute_60'