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

    【完】

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

  • 相关阅读:
    django + scrapy 部署
    scrapyd 爬虫部署
    爬虫部署
    使用Scrapy爬取图片入库,并保存在本地
    学习Spider 了解 Scrapy的流程
    Django 的 一些基本操作:视图函数,路由配置
    Django 了解
    sql
    嚯嚯~ module 1
    Long Way To Go 之 Python 5 (2)
  • 原文地址:https://www.cnblogs.com/tangjiao/p/9946151.html
Copyright © 2011-2022 走看看