Proxy,Reflect

Pythonista
• 阅读 1315

Proxy

Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”

监视某个对象的属性读写Object.defineProperty (vue3.0之前,3.0之后使用proxy)

  • 简单介绍下 Object.defineProperty

    Object.defineProperty(obj,"key",{
    enumerable:false, //key属性是否可以在for..in || Object.keys()中被枚举
    configurable:false, //key属性是否可被删除,以及除 value 和 writable 特性外的其他特性是否可以被修改
    writable:false, //不可写入,也就是不可更改obj.key
    value:undefined,
    get:undefined,
    set:undefined
    })
  • 初始化一个 new Proxy实例

    const person ={
    name:"mcgee",
    age:18
    }
    //创建proxy构造函数,参数1代理的对象,参数2执行对象
    const personProxy = new Proxy(person,{
    get(target,property){
      // console.log(target,property); //{ name: 'mcgee', age: 18 } name
      // return 100 //外部访问属性的返回值 返回值可以是任意类型
      return property in target ? target[property]:'default'
    },
    set(target,property,value){
      // console.log(target,property,value);
      if(property === "age" && !Number.isInteger(value)){
        throw new Error(`${value} is not an int`)
      }
    
      return target[property] == value //返回值可以是任意类型
    }
    })
    
    console.log(personProxy.name) //100 "mcgee"
    console.log(personProxy.xxx); //default
    personProxy.render = true
    console.log(personProxy); //添加了个render为true的属性
    // personProxy.age = "aa"  //Error: aa is not an int

    具体13个方法例子详见此处

ES6阮一峰教程

Reflect

静态类,不能通过 new 构造实例对象,只能调静态类的静态方法,类似于Math对象

内部封装了一系列对对象的底层操作

Reflect成员方法就是Proxy处理对象的默认实现,它的价值,统一提供了一套用于操作对象的API

const obj = {
  name:"mcgee",
  age:18
}
const proxy1 = new Proxy(obj,{
  get(target,property){         //如果没添加get方法,内部默认使用了添加了reflect的方法
    return Reflect.get(target,property)
  }
})
console.log(proxy1.name);
//传统的访问
console.log("name" in proxy1);
console.log(delete obj['age']);
console.log(Object.keys(obj));
//使用reflect访问
Reflect.has(obj,"name")
Reflect.deleteProperty(obj,"age")
Reflect.ownKeys(obj)
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java模式之一
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问代理模式的三种实现(1)静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.eg publicinterfacePammerDao{   voiddomain();}publicTargetimpl
Wesley13 Wesley13
3年前
java的动态代理
1\.什么是动态代理代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。Java的动态代理比代理的思想更前进了一步,它可以动态地创建并代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相
Easter79 Easter79
3年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Stella981 Stella981
3年前
MyBatis插件开发
MyBatis插件开发一、前言MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果。MyBatis允许在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis允许使用插件来拦截的方法调用包
Stella981 Stella981
3年前
Spring AOP
9.SpringAOP:切面之前谈到的AOP框架其实可以将它理解为一个拦截器框架,但这个拦截器似乎非常武断。比如说,如果它拦截了一个类,那么它就拦截了这个类中所有的方法。类似地,当我们在使用动态代理的时候,其实也遇到了这个问题。需要在代码中对所拦截的方法名加以判断,才能过滤出我们需要拦截的方法,想想这种做法确实不太优雅。在大量的真实项目中,似乎我
Easter79 Easter79
3年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
JDK动态代理的简单实现
1\.先理一下动态代理实现的思路:    实现功能:自己定义一个类Proxy,通过Proxy的静态方法newProxyInstance(Class<Tintface,InvocationHandlerh)返回代理对象, intface:被代理类的接口对象, h:InvocationHandler的实例对象    1).声明一段动
Wesley13 Wesley13
3年前
Java中jdk代理和cglib代理
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理静态代理:也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见:
Wesley13 Wesley13
3年前
Java面向对象之封装
概述面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。封装的原则将属性隐藏起来,若需要访问某个属性,提供公共方法
Wesley13 Wesley13
3年前
Java代理模式的实现方式
代理模式是23种设计模式之一,定义为:为其他对象提供一种代理以控制对这个对象的访问。简单来说就是在调用方无感知的情况下,修改原有的行为。\TOC\静态代理即通过手动编码方式实现publicinterfaceIFooService{voidfoo();}publicclass
Wesley13 Wesley13
3年前
ByxAOP——简易AOP框架
ByxAOP是一个基于JDK动态代理的简易AOP框架,具有以下功能特性:对目标对象的特定方法进行拦截和增强支持灵活的拦截规则和自定义拦截规则动态实现接口和批量实现接口方法灵活的对象代理机制项目地址:github码云使用示例首先来通过一个简单例子快速了解ByxAOP。假设我们有一个User