zoukankan      html  css  js  c++  java
  • ES6引入的Reflect对象目的何在?

    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里面进行观察者方法的触发。

    【完】

    如果不想动辄就暴露智商 
    要么多读书要么少说话

  • 相关阅读:
    【NOIP2007】守望者的逃离
    20200321(ABC)题解 by 马鸿儒 孙晨曦
    20200320(ABC)题解 by 王一帆
    20200319(ABC)题解 by 王一帆 梁延杰 丁智辰
    20200314(ABC)题解 by 董国梁 蒋丽君 章思航
    20200309(ABC)题解 by 梁延杰
    20200307(DEF)题解 by 孙晨曦
    20200306(ABC)题解 by 孙晨曦
    20200305(DEF)题解 by 孙晨曦
    20200303(ABC)题解 by 王锐,董国梁
  • 原文地址:https://www.cnblogs.com/tangjiao/p/9946151.html
Copyright © 2011-2022 走看看