Js代理模式

更新日期: 2019-08-02阅读: 2.4k标签: 模式

所谓的代理者是指一个类别可以作为其它东西的接口。代理者可以作任何东西的接口:网络连接、内存中的大对象、文件或其它昂贵或无法复制的资源。著名的代理模式例子为引用计数(英语:reference counting)指针对象。

当一个复杂对象的多份副本须存在时,代理模式可以结合享元模式以减少内存用量。典型作法是创建一个复杂对象及多个代理者,每个代理者会引用到原本的复杂对象。而作用在代理者的运算会转送到原本对象。一旦所有的代理者都不存在时,复杂对象会被移除。

var backPhoneList = ['12345566'];//黑色单列表
//  代理
var ProxyAcceptPhone = function(phone){
 console.log('电话正在接入...')
 if(backPhoneList.includes(phone)){
     console.log('屏蔽黑名单电话')
 }else{
    //  转接
    AcceptPhone.call(this,phone)
 }
}
// 本体
var AcceptPhone = function(phone){
console.log('接听电话',phone)
}
// 外部调用代理
ProxyAcceptPhone('12345566')
ProxyAcceptPhone('18900044440')


什么是Proxy对象?

Proxy对象就是可以让你去对JavaScript中的一切合法对象的基本操作进行自定义.然后用你自定义的操作去覆盖其对象的基本操作.也就是当一个对象去执行一个基本操作时,其执行的过程和结果是你自定义的,而不是对象的。

首先Proxy的语法是: 

let p = new Proxy(target, handler);

1. target是你要代理的对象.它可以是JavaScript中的任何合法对象.如: (数组, 对象, 函数等等) 

2. handler是你要自定义操作方法的一个集合. 

3. p是一个被代理后的新对象,它拥有target的一切属性和方法.只不过其行为和结果是在handler中自定义的. 

在支持 Proxy 的浏览器环境中,Proxy 是一个全局对象, 可以直接使用。Proxy(target, handler) 是一个构造函数,target 是被代理的对象, handlder 是声明了各类代理操作的对象,最终返回一个代理对象。 外界每次通过代理对象访问 target 对象的属性时,就会经过 handler 对象, 从这个流程来看,代理对象很类似 middleware(中间件)。 那么 Proxy 可以拦截什么操作呢? 最常见的就是 get(读取)、set(修改)对象属性等操作, 此外,Proxy 对象还提供了一个 revoke 方法,可以随时注销所有的代理操作。  

let obj ={
  a:1,
  b:2
}
const p = new Proxy(obj,{
  get(target,key,value){
    if(key == 'c'){
      return '我是自定义的2一个结果'
    }else{
      return target[key];
    }
  },
  set(target,key,value){
    if(value==4){
      target[key]='我是自定义的一个结果'
    }else{
      target[key] = value;
    }
  }
})
console.log(obj.a)//1
console.log(obj.c)//underfined
console.log(p.a)//1
console.log(p.c)//我是自定义的一个结果
obj.name = '李白'
console.log(obj.name)//李白
console.log(p.name)//李白
p.age=4
console.log(obj.age)//我是自定义的一个结果
console.log(p.age)//我是自定义的一个结果

Proxy对象的作用.即是之前所受的用于定义基本操作的自定义行为. 同样的get和set操作.没有没代理的对象所得的结果是其JavaScript本身的执行机制运行计算后所得到的. 而被代理了的对象的结果则是我们自定义的. 

Proxy所能代理的范围--handler  

在上面代码中,我们看到了构造一个代理对象时所传的第二个参数handler, 这个handler对象是由get和set两个函数方法组成的. 这两个方法会在一个对象被get和set时被调用执行, 以代替原生对象上的操作.那么为什么在handler, 定义get和set这两个函数名之后就代理对象上的get和set操作了呢? 实际上handler本身就是ES6所新设计的一个对象.它的作用就是用来自定义代理对象的各种可代理操作。 它本身一共有13中方法,每种方法都可以代理一种操作.


其13种方法如下:

handler.getPrototypeOf()
// 在读取代理对象的原型时触发该操作,比如在执行 Object.getPrototypeOf(proxy) 时。
handler.setPrototypeOf()
// 在设置代理对象的原型时触发该操作,比如在执行 Object.setPrototypeOf(proxy, null) 时。
handler.isExtensible()
// 在判断一个代理对象是否是可扩展时触发该操作,比如在执行 Object.isExtensible(proxy) 时。
handler.preventExtensions()
// 在让一个代理对象不可扩展时触发该操作,比如在执行 Object.preventExtensions(proxy) 时。
handler.getOwnPropertyDescriptor()
// 在获取代理对象某个属性的属性描述时触发该操作,
//比如在执行 Object.getOwnPropertyDescriptor(proxy, "foo") 时。
handler.defineProperty()
// 在定义代理对象某个属性时的属性描述时触发该操作,
//比如在执行 Object.defineProperty(proxy, "foo", {}) 时。
handler.has()
// 在判断代理对象是否拥有某个属性时触发该操作,比如在执行 "foo" in proxy 时。
handler.get()
// 在读取代理对象的某个属性时触发该操作,比如在执行 proxy.foo 时。
handler.set()
// 在给代理对象的某个属性赋值时触发该操作,比如在执行 proxy.foo = 1 时。
handler.deleteProperty()
// 在删除代理对象的某个属性时触发该操作,比如在执行 delete proxy.foo 时。
handler.ownKeys()
// 在获取代理对象的所有属性键时触发该操作,比如在执行 Object.getOwnPropertyNames(proxy) 时。
handler.apply()
// 在调用一个目标对象为函数的代理对象时触发该操作,比如在执行 proxy() 时。
handler.construct()
// 在给一个目标对象为构造函数的代理对象构造实例时触发该操作,比如在执行new proxy() 时。


Proxy的作用

对于代理模式Proxy的作用主要体现在三个方面: 

1、 拦截和监视外部对对象的访问 
2、 降低函数或类的复杂度 
3、 在复杂操作前对操作进行校验或对所需资源进行管理  



链接: https://www.fly63.com/article/detial/4491

js设计模式之单例模式,javascript如何将一个对象设计成单例

单例模式是我们开发中一个非常典型的设计模式,js单例模式要保证全局只生成唯一实例,提供一个单一的访问入口,单例的对象不同于静态类,我们可以延迟单例对象的初始化,通常这种情况发生在我们需要等待加载创建单例的依赖。

前端设计模式:从js原始模式开始,去理解Js工厂模式和构造函数模式

工厂模式下的对象我们不能识别它的类型,由于typeof返回的都是object类型,不知道它是那个对象的实例。另外每次造人时都要创建一个独立的person的对象,会造成代码臃肿的情况。

JavaScript设计模式_js实现建造者模式

建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象

html和xhtml,DOCTYPE和DTD,标准模式和兼容模式

主要涉及知识点: HTML与XHTML,HTML与XHTML的区别,DOCTYPE与DTD的概念,DTD的分类以及DOCTYPE的声明方式,标准模式(Standard Mode)和兼容模式(Quircks Mode),标准模式(Standard Mode)和兼容模式(Quircks Mode)的区别

前端四种设计模式_JS常见的4种模式

JavaScript中常见的四种设计模式:工厂模式、单例模式、沙箱模式、发布者订阅模式

javascript 策略模式_理解js中的策略模式

javascript 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句,策略模式提供了开放-封闭原则,使代码更容易理解和扩展, 策略模式中的代码可以复用。

javascript观察者模式_深入理解js中的观察者模式

javascript观察者模式又叫发布订阅模式,观察者模式的好处:js观察者模式支持简单的广播通信,自动通知所有已经订阅过的对象。存在一种动态关联,增加了灵活性。目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用。

Vue中如何使用方法、计算属性或观察者

熟悉 Vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以使用它们中任何一个都是可以的

我最喜欢的 JavaScript 设计模式

我觉得聊一下我爱用的 JavaScript 设计模式应该很有意思。我是一步一步才定下来的,经过一段时间从各种来源吸收和适应直到达到一个能提供我所需的灵活性的模式。让我给你看看概览,然后再来看它是怎么形成的

Flutter 设计模式 - 简单工厂

在围绕设计模式的话题中,工厂这个词频繁出现,从 简单工厂 模式到 工厂方法 模式,再到 抽象工厂 模式。工厂名称含义是制造产品的工业场所,应用在面向对象中,顺理成章地成为了比较典型的创建型模式

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!