面向对象设计里的设计模式之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
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相关推荐
- 设计模式在JavaScript中的应用(如单例模式、工厂模式等)。 - 测试驱动开发(TDD)在前端项目中的实践。 3. **JavaScript深度剖析(从入门到精通)** - **核心知识点**: - JavaScript引擎的工作原理。 - 内存...
在"web-330"课程中,两位撰稿人——Krasso教授和Kurt G Leadley——来自贝尔维尤大学,他们深入探讨了如何通过JavaScript设计模式来提升代码质量和可扩展性。 设计模式是一种在特定情况下解决软件设计问题的经验...
3. 寄生构造函数、工厂模式、单例模式等设计模式,以及如何利用原型实现继承。 4. 模块化:掌握CommonJS、AMD、UMD和ES6模块的导入导出机制,以及如何在项目中进行模块化管理。 三、高级特性 1. 函数式编程:了解...
在JavaScript的世界里,设计模式是一种解决常见编程问题的模板或最佳实践。这些模式总结了前人的经验,使得开发者能够高效地构建可维护、可扩展的代码。"DesignPatterns-JS-Clicker"项目是一个关于JavaScript设计...
这个名为"javascript_designpattern"的压缩包很可能是包含了一系列关于JavaScript设计模式的实例代码和解释。由于描述中提到是“旧的JavaScript版本”,我们可以预期这些示例可能基于ECMAScript 5或者更早的版本,...
2. **代码复用**:虽然原生JavaScript可能需要更多的代码来实现相同的功能,但通过合理的设计和模块化,可以有效提升代码复用。 3. **开发效率**:框架和库提供了一些便利的功能,如自动化绑定、生命周期管理等,...
观察者模式(Observer Pattern)和订阅者模式是软件设计中常用的一种模式,它们的主要目的是实现对象之间的松耦合。在JavaScript中,这两种模式通常用于事件处理,使得对象之间可以通过事件来传递信息,而不必直接...
5. **MVC架构**:遵循MVC模式进行设计,提高了代码的可维护性和可扩展性。 #### 三、使用Sencha Touch构建移动应用的优势 - **统一的代码基础**:使用单一的代码库可以在多个平台上运行应用,降低了开发成本和维护...
【标题】Web-Minecraft-Proxy:基于JavaScript的Web Minecraft代理服务器 在当今的网络游戏世界中,Minecraft作为一款备受欢迎的沙盒游戏,其玩家群体庞大且活跃。Web-Minecraft-Proxy是一个专为Minecraft设计的...
它遵循Model-View-Controller(MVC)设计模式,并提供了一种标准的方式来组织和协调应用程序的各个部分。PureMVC_JS_Native_MultiCore版本是专门为JavaScript开发的,支持多核心架构,这意味着它可以更有效地在大型...
ES6(ECMAScript 2015)在JavaScript的发展历程中引入了诸多重要的特性,其中Proxy和Reflect就是两个用来扩展语言核心功能的API。它们允许开发者拦截并定义自定义行为的操作,如属性查找、赋值、枚举、函数调用等。 ...
MVC是一种设计模式,将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Sencha Touch中,模型用于管理数据,视图负责展示用户界面,而控制器作为桥梁,协调模型和视图之间的交互。...
总的来说,JavaScript虽然没有内置的私有化机制,但通过闭包、类字段提案以及一些设计模式,开发者可以有效地模拟私有成员。随着语言的不断发展,未来的JavaScript将可能提供更完善的私有化支持。在实践中,我们需要...
MVVM是一种设计模式,它使得视图(View)与模型(Model)之间的数据绑定变得简单,通过数据双向绑定实现了UI和业务逻辑的解耦。 本实例中,我们将探讨如何利用JavaScript的属性访问器和数组的某些API来实现对对象...
随着版本的更新,现在可以使用同步访问模式,Ext.data.Record也做了相应的升级支持。 - **示例代码**:下面的代码展示了如何在SQLite数据库中持久化`Ext.data.Record`实例,并且整合过程相对简单。 ```javascript ...
Flex企业应用开发实战源代码 本书由业界4位拥有近10年企业级应用开发经验的资深专家撰写,权威性毋庸置疑。 全书共分为4大部分,涵盖企业级应用开发的整个生命周期。首先介绍了Flex/Flash的工作机理和利用Flex开发...
1. MVC(Model-View-Controller)模式:这是一种软件设计模式,用于组织和分离业务逻辑、视图呈现和用户交互。 2. Store:存储数据模型,负责数据的加载、更新和管理。 3. Proxy:与后端服务器通信的接口,可以是...
9. **MVC架构**:Sencha Touch采用Model-View-Controller(MVC)设计模式,帮助组织代码,提高可维护性和可扩展性。 10. **性能优化**:Sencha Touch通过优化触摸事件处理、本地存储利用和离线应用支持等方式,确保...
ExtJS是一款基于JavaScript的开源前端框架,它为开发者提供了丰富的UI组件库、数据处理工具以及应用程序架构模式。通过ExtJS,开发者可以构建高性能、可定制的企业级Web应用。ExtJS支持多种布局管理器,如CardLayout...
"Aso.design" 是一个专为中后台设计的免费模版,它结合了现代前端技术栈,包括 Vue3、Vite 和 Naive UI,同时利用 TypeScript 提供了更加强大的类型检查和代码提示,旨在提升开发效率和项目质量。 **Vue3**: Vue3 ...