`
JerryWang_SAP
  • 浏览: 1030385 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

100行代码让您学会JavaScript原生的Proxy设计模式

阅读更多

面向对象设计里的设计模式之Proxy(代理)模式,相信很多朋友已经很熟悉了。比如我之前写过代理模式在Java中实现的两篇文章:

Java代理设计模式(Proxy)的四种具体实现:静态代理和动态代理

Java动态代理之InvocationHandler最简单的入门教程

其实和Java一样,JavaScript从语言层面来讲,也提供了对代理这个设计模式的原生支持。我们用一个不到100行代码的例子来看看吧。

下面的代码创建了一个名叫Jerry的Employee对象,然后用函数hireEmployee雇用该Employee进行JavaScript开发:

function Employee(name){

     this.name = name;

};

Employee.prototype.work = function(language){

     console.log(this.name + " is developing with: " + language);

}

let jerry = new Employee("Jerry");

function hireEmployee(employee, language){

      employee.work(language);

}

hireEmployee(jerry, "JavaScript");
 
 

打印输出:

Jerry is developing with: JavaScript

现在Jerry在他的业余时间里想学习一些其他的编程语言,但是不想影响自己的本职工作。用技术语言来讲,就是希望Employee原型方法work执行时,打印一行额外的信息,但是不允许修改Employee函数和Employee.prototype.work本身。这时Proxy这种代理模式就派上用场了。

我们为work方法创建一个代理逻辑:

var proxyLogic = {
get: function(target, name) {
    if( name == "work"){
        var oriFun = target[name].bind(target);
        return function(language){
            oriFun(language);
            console.log("and also study other language in spare time");
        }
    }
}
}
;

重点看第二行的get方法。两个输入参数,target和name。Target代表当前执行方法的实例,即方法调用者。Name代表具体的方法名称。第4行我们把原始方法取出来,存放到变量oriFun里。第五行返回一个新的JavaScript函数,该函数体的实现逻辑为首先在第六行调用原始方法,然后在第七行执行额外的逻辑。

 
 

大家在回忆我之前介绍Java InvocationHandler实现动态代理的文章:

Java动态代理之InvocationHandler最简单的入门教程

是不是思路完全一样?都是在代理逻辑里调用原始方法,然后再执行额外的代码。

 
 

这个proxyLogic生成后,怎么把它同我们原始的需要被代理的代码关联起来呢?

只需要1行代码:

var jerryProxy = new Proxy(jerry, proxyLogic );

Proxy函数是JavaScript提供的原生代理构造器,需要两个输入参数:

 
 

第一个输入参数是我们的Employee实例,即需要被代码的对象实例,第二个输入参数是我们开发好的代理逻辑。返回的即是装配好的代理对象,该代理对象的work方法实现在第二个输入参数里。

现在我们再次调用hireEmployee,传入Proxy构造器返回的代理对象:

hireEmployee(jerryProxy, "JavaScript");

打印输出,代理逻辑生效了:

 
 

和Java的Invocation一样优雅地实现了代理设计模式。

使用Proxy代理设计模式的一个实际例子,请参考我的文章:

巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验

要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:


 
 
 


作者:JerryWangSAP
链接:https://www.jianshu.com/p/32cd408ad716
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
0
0
分享到:
评论

相关推荐

    Javascript完全自学宝典

    - 设计模式在JavaScript中的应用(如单例模式、工厂模式等)。 - 测试驱动开发(TDD)在前端项目中的实践。 3. **JavaScript深度剖析(从入门到精通)** - **核心知识点**: - JavaScript引擎的工作原理。 - 内存...

    web-330:JavaScript设计模式

    在"web-330"课程中,两位撰稿人——Krasso教授和Kurt G Leadley——来自贝尔维尤大学,他们深入探讨了如何通过JavaScript设计模式来提升代码质量和可扩展性。 设计模式是一种在特定情况下解决软件设计问题的经验...

    JAVA上百实例源码以及开源项目源代码

    例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;在...

    JavaScript学习指南 第二版

    3. 寄生构造函数、工厂模式、单例模式等设计模式,以及如何利用原型实现继承。 4. 模块化:掌握CommonJS、AMD、UMD和ES6模块的导入导出机制,以及如何在项目中进行模块化管理。 三、高级特性 1. 函数式编程:了解...

    DesignPatterns-JS-Clicker:JS 设计模式的赋值

    在JavaScript的世界里,设计模式是一种解决常见编程问题的模板或最佳实践。这些模式总结了前人的经验,使得开发者能够高效地构建可维护、可扩展的代码。"DesignPatterns-JS-Clicker"项目是一个关于JavaScript设计...

    javascript_designpattern

    这个名为"javascript_designpattern"的压缩包很可能是包含了一系列关于JavaScript设计模式的实例代码和解释。由于描述中提到是“旧的JavaScript版本”,我们可以预期这些示例可能基于ECMAScript 5或者更早的版本,...

    NactiveCode:回归原生, 不依赖任何框架和js库

    2. **代码复用**:虽然原生JavaScript可能需要更多的代码来实现相同的功能,但通过合理的设计和模块化,可以有效提升代码复用。 3. **开发效率**:框架和库提供了一些便利的功能,如自动化绑定、生命周期管理等,...

    原生js实现的观察者和订阅者模式简单示例

    观察者模式(Observer Pattern)和订阅者模式是软件设计中常用的一种模式,它们的主要目的是实现对象之间的松耦合。在JavaScript中,这两种模式通常用于事件处理,使得对象之间可以通过事件来传递信息,而不必直接...

    Sencha+Touch+Mobile+JavaScript+Framework.pdf

    5. **MVC架构**:遵循MVC模式进行设计,提高了代码的可维护性和可扩展性。 #### 三、使用Sencha Touch构建移动应用的优势 - **统一的代码基础**:使用单一的代码库可以在多个平台上运行应用,降低了开发成本和维护...

    web-minecraft-proxy:Web-Minecraft的代理服务器

    【标题】Web-Minecraft-Proxy:基于JavaScript的Web Minecraft代理服务器 在当今的网络游戏世界中,Minecraft作为一款备受欢迎的沙盒游戏,其玩家群体庞大且活跃。Web-Minecraft-Proxy是一个专为Minecraft设计的...

    PureMVC_JS_Native_MultiCore.zip

    它遵循Model-View-Controller(MVC)设计模式,并提供了一种标准的方式来组织和协调应用程序的各个部分。PureMVC_JS_Native_MultiCore版本是专门为JavaScript开发的,支持多核心架构,这意味着它可以更有效地在大型...

    ES6 proxy和reflect的使用方法与应用实例分析

    ES6(ECMAScript 2015)在JavaScript的发展历程中引入了诸多重要的特性,其中Proxy和Reflect就是两个用来扩展语言核心功能的API。它们允许开发者拦截并定义自定义行为的操作,如属性查找、赋值、枚举、函数调用等。 ...

    Sencha touch + .net service, 入门代码

    MVC是一种设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Sencha Touch中,模型用于管理数据,视图负责展示用户界面,而控制器作为桥梁,协调模型和视图之间的交互。...

    深入了解JavaScript 私有化

    总的来说,JavaScript虽然没有内置的私有化机制,但通过闭包、类字段提案以及一些设计模式,开发者可以有效地模拟私有成员。随着语言的不断发展,未来的JavaScript将可能提供更完善的私有化支持。在实践中,我们需要...

    JS 对象与数组的监听实例

    MVVM是一种设计模式,它使得视图(View)与模型(Model)之间的数据绑定变得简单,通过数据双向绑定实现了UI和业务逻辑的解耦。 本实例中,我们将探讨如何利用JavaScript的属性访问器和数组的某些API来实现对对象...

    Ext2 核心 API 中文详解

    随着版本的更新,现在可以使用同步访问模式,Ext.data.Record也做了相应的升级支持。 - **示例代码**:下面的代码展示了如何在SQLite数据库中持久化`Ext.data.Record`实例,并且整合过程相对简单。 ```javascript ...

    Flex企业应用开发实战源代码

    Flex企业应用开发实战源代码 本书由业界4位拥有近10年企业级应用开发经验的资深专家撰写,权威性毋庸置疑。 全书共分为4大部分,涵盖企业级应用开发的整个生命周期。首先介绍了Flex/Flash的工作机理和利用Flex开发...

    Ext3.2_Could_APP

    1. MVC(Model-View-Controller)模式:这是一种软件设计模式,用于组织和分离业务逻辑、视图呈现和用户交互。 2. Store:存储数据模型,负责数据的加载、更新和管理。 3. Proxy:与后端服务器通信的接口,可以是...

    sencha-touch-2.0.0-pr1.zip

    9. **MVC架构**:Sencha Touch采用Model-View-Controller(MVC)设计模式,帮助组织代码,提高可维护性和可扩展性。 10. **性能优化**:Sencha Touch通过优化触摸事件处理、本地存储利用和离线应用支持等方式,确保...

    extjs 学习心得笔记

    ExtJS是一款基于JavaScript的开源前端框架,它为开发者提供了丰富的UI组件库、数据处理工具以及应用程序架构模式。通过ExtJS,开发者可以构建高性能、可定制的企业级Web应用。ExtJS支持多种布局管理器,如CardLayout...

Global site tag (gtag.js) - Google Analytics