当前位置:首页 > CN2资讯 > 正文内容

JS方法代理js 代理

9小时前CN2资讯

作者:Jiang, Jilin

JS作为一门脚本语言。十分easy上手。外加其灵活性,能够轻而易举地扩展功能。今天,我们就聊聊JS的方法代理。

方法代理是脚本语言中常见的方法扩展形式。这样的灵活的形式长处在于遇到复杂的JS代码须要扩展时,能够相对简单的抽取并改动。可是,其缺点也十分明显,会造成代码的碎片化,因而是一把双刃剑。

基本形式

var _func = obj.func;

obj.func = function() {

         return _func();

};

此处。obj的func方法是原始方法。

我们使用一个_func变量保存该方法。之后重写func方法。返回调用原始的方法。

相当的好理解。

不定长參数

有时候,我们会遇到不定长參数的形式。那么我们能够做下面更改:

var _func = obj.func;

obj.func = function() {

         return _func.apply(this, arguments);

};

写到这里,JS方法代理的两种形式已经写完了。这时。你可能会疑惑这样的方法代理有什么用?那么,就尾随我看看几个样例吧:

重写静态方法

出于某些原因。我们须要在console打印的同一时候,将打印传输数据到指定server上用户帮助统计数据。而在开发过程中,直接使用了原生态的console.log方法输出。那么。我们就可做例如以下改动。

         首先,构建代理方法:

var _log = console.log;

console.log = function() {

         return _log.apply(this, arguments);

};

接着,插入ajax调用逻辑:

console.log = function() {

         var _args = Array.prototype.slice.call(arguments);

         $.post("srvAddr", {userID: userID, args: _args});

         return _log.apply(this, arguments);

};

能够非常easy预见效果:



原型代理

有时候,我们须要直接接管一个类的方法。

那么对应的。我们就要将其prototype中的方法做代理。如今我们如果要使得Array默认支持数字排序:

var _sort = Array.prototype.sort;

Array.prototype.sort = function() {

         _sort.apply(this, arguments);

};

我们首先检測数组中的元素是否是数字。假设是则依照数字排序,否则就依照默认方式排序:

var _sort = Array.prototype.sort;

Array.prototype.sort = function() {

         var _isNum = true;

         for(var i = 0 ; i < this.length ; i += 1) {

                   if(typeof this[i] !== "number") {

                            _isNum = false;

                            break;

                   }

         }

         if(_isNum) {

                   return _sort.call(this, function(a, b) {

                            return a - b;

                   });

         } else {

                   return _sort.apply(this, arguments);

         }

};

原始排序方式(将数字转换成字符排序)

代理后排序方式

 

注意:此处仅作为原型方法代理的样例。

在实际开发中。应该尽量避免对原生对象原型方法做代理。

重载

在jQuery中,toggle方法拥有多种重载。当中一个为toggle(display)。通过接受boolean參数来决定元素显示还是隐藏。

而fadeToggle方法则不接受该參数。

让我们进行简单的代理,使其支持boolean參数:

var _fadeToggle = $.fn.fadeToggle;

$.fn.fadeToggle = function(display) {

         if(arguments.length === 1 && typeof display === "boolean") {

                   if(display) {

                            return this.fadeIn();

                   } else {

                            return this.fadeOut();

                   }

         }

         return _fadeToggle.apply(this, arguments);

};

通过參数长度和接收參数类型类型推断是否调用fadeIn或fadeOut方法。假设不匹配则调用原来的fadeToggle方法。以此类推,slideToggle也能够相同适用。

*继承

继承中,我们有时候会须要调用父类方法来实现。这和java中的super有些类似。一个简单的样例。我们定义了一个Person,能够laugh。

同一时候定义一个Robot继承,是其沿用Person的laugh可是稍作改动:

var Person = function() {

         = "";

         this.laugh = function() {

                   return "Ha ha!";

         };

         return this;

};

var Robot = function() {

         Person.apply(this);

         var _laugh = this.laugh;

         this.laugh = function() {

                   return encodeURIComponent(_laugh());

         };

         return this;

};

劫持

说到劫持,则和安全性開始挂钩了。

现在大多数站点都习惯于使用开源的js库来开发,可是假设碰巧被插入了恶意代码,那么安全也就变得不安全了(比如chrome中大量未经验证的游览器插件)。

下面,我们将举几个劫持的样例。

Ajax劫持

不少人以为,通过闭包的方式将重要用户參数存储在作用域内(比如动态生成的secureID)。那么即便是被插入了恶意代码也无法获取到。从而无法伪造ajax请求来获取重要信息似乎就足够了。可是假设整个ajax请求被拦截了呢?

var _ajax = $.ajax;

$.ajax = function() {

         var $p = _ajax.apply($, arguments);

         $p.done(function(data) {

                   // Do something...

         });

         return $p;

};

jQuery中全部ajax请求(get,post,getJSON)终于都会调用$.ajax来实现。而通过方法代理直接劫持$.ajax方法并返回一个正常promise对象,会使得页面脚本执行毫无影响。可是实际上数据已经被劫持走了。

Array劫持

         Array拥有不少原型方法。比如push,pop,shift,unshift等等。我们仅仅须要简单的代理数组操作方法,便能够截获数据。

var _push = Array.prototype.push;

Array.prototype.push = function() {

         // Do something...

         return _push.apply(this, arguments);

};

好了,以上就是这次的方法代理介绍。因为方法代理会混乱代码逻辑使得代码结构变得不易理解。

在日常开发过程中,我们应该尽量避免使用它。仅仅有在代理重载,或者更改难以理解的遗留代码的部分逻辑时使用它。

从而避免将双刃剑误伤了自己。


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/32121.html

    标签: JS方法代理
    分享给朋友:

    “JS方法代理js 代理” 的相关文章

    PVE环境下是否需要设置路由器?轻松拷贝文件的最佳实践

    PVE概述 Proxmox Virtual Environment(PVE)是一个开源的虚拟化管理平台,集成了KVM和LXC技术。简单来说,它允许用户在一台物理服务器上创建和管理多个虚拟机和容器。使用PVE让你轻松地部署、监控和管理自己的虚拟化环境,不论是用于开发、测试,还是生产环境。PVE提供了一...

    解决Linode被封的问题与账户恢复策略分享

    Linode作为一款备受欢迎的美国VPS,其灵活性和服务质量吸引了众多用户。然而,基于我的经验,国内用户在使用Linode时常常面临被封的困扰。这不仅影响了使用体验,也对业务的持续性造成了影响。我想深入分析一下Linode被封的原因。 首先,Linode的全球网络状况在近年来遭遇了严峻挑战。随着越来...

    搬瓦工Plan v2:高性价比VPS套餐详解与用户指南

    搬瓦工Plan v2作为一个限量版VPS套餐,给很多用户带来了新的选择。与之前的The Plan套餐相比,Plan v2在配置与流量方面都实现了显著的提升。这款套餐不仅是一种实用的解决方案,也为不同需求的用户提供了灵活的选择。接下来,我将分享一些关于这个套餐的背景信息、主要升级点以及它适合哪些用户。...

    VPS论坛:虚拟主机爱好者的交流与学习平台

    VPS论坛概述 VPS论坛是一个专为VPS主机爱好者提供交流与分享的平台。在这里,像我这样对VPS感兴趣的人们,可以参与关于虚拟专用服务器的各种讨论。VPS实际上属于一个相对小众的领域,因此知名的VPS论坛数量较少,但它们所承载的信息和交流却是丰富多彩的。这些论坛不仅是获取信息的重要来源,更是与其他...

    RFCHOST评论:高性能VPS与流媒体解锁的完美选择

    RFCHOST概述 RFCHOST是一家自2015年成立的公司,隶属于上海花卷科技。作为一家新兴的网络服务企业,RFCHOST专注于提供国际线路深层挖掘与构造网络通信服务的一体化解决方案。我一直关注着这个快速发展的品牌,尤其是它在香港和洛杉矶VPS业务上的持续投入与创新。 随着全球数字化进程的加速,...

    Vultr DD Windows安装教程:轻松一步到位

    在云计算越来越流行的今天,Vultr作为一个强大的云服务提供商,吸引了大量用户。对于想在Vultr服务器上安装Windows的用户来说,使用DD命令是一种非常便利的方法。接下来,我将为你详细介绍如何通过这一方式在Vultr上安装Windows。 1.1 使用DD命令直接安装Windows 1.1.1...