博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS实现重载
阅读量:4493 次
发布时间:2019-06-08

本文共 2381 字,大约阅读时间需要 7 分钟。

在js中,我们实现重载常用的方式有:

1、根据传入参数的类型执行不同的操作。

2、利用参数中特殊的参数值进行不同的操作。

3、根据参数的个数进行重载。

这里对第三种重载方式的实现进行说明。

实现第三种方法,最简单的就是使用switch case进行参数个数的判断,然后执行相应的操作,但这样的判断方法导致代码不是很整洁,逼格也不算是太高。

如:

function fn() {            switch (arguments.length) {                case 0:                    //执行语句块                    break;                case 1:                    //执行语句块                    break;                case 2:                    //执行语句块                    break;                default:                    break;            }        }

下面介绍一种方法,先不考虑是否适用,但可以通过了解这种重载方式,让我们学到一些JS中的技巧和对闭包的一些理解。毕竟多了解些不算件坏事。

先上代码:

var arr = {            value: ["a", "b", "c"]        };        bindMethod(arr, "find", function () {            console.log(0)        });        bindMethod(arr, "find", function (a) {            console.log(1)        });        bindMethod(arr, "find", function (a, b) {            console.log(2)        });        function bindMethod(obj, name, fn) {            var old = obj[name]; //每个方法中都会存在一个各自的old对象,产生了闭包            obj[name] = function () {                if (fn.length == arguments.length) {  //这里的fn.length是方法定义参数的个数,和arguments.length传入的个数是两回事                    return fn.apply(this, arguments); //返回传入在匿名函数,执行                }                else {                    return old.apply(this, arguments); //返回数组的方法,再次向上进行查找                }            }        }        arr.find(); //0        arr.find(1);  //1        arr.find(1, 2);  //2        arr.find(1, 2, 3); //Uncaught TypeError: Cannot read property 'apply' of undefined       /** 第一次进行绑定时,先赋值old,因为attr.find并没有被创建,所以old=undefined。然后为arr对象find属性创建一个匿名方法,这个匿名方法fn.length=1。第二次进行绑定时,将old对象指向第一次创建的匿名方法,然后会将arr对象find属性指向到当前创建的匿名方法,因为old指向上个方法的引用,这就会造成上个方法不会被释放。第三次也是一样的步骤,保证第二次绑定的方法不会被释放。重载方法的执行,像一个链条一样,先从最后绑定的方法内部开始寻找 方法定义的参数个数和传入的个数是否匹配,如果匹配则返回当前的传入的匿名函数,否则继续向上查找,直到找到为止。如果最后没有找到结果,当前程序会报错,因为第一次绑定方法时,old对象是一个undefined**/

 

绑定阶段

先将arr绑定三个方法,每个方法都有一个old的对象,存放之前保存的方法,以此类推,(当前的方法中,old对象都会指向上一次绑定方法,但是注意,在第一次绑定的方法中,old对象是undefind),这样就可以形成一个链条。也就是说内存中分别有三个attr.find的内存空间,都指向各自创建bindMethod内的匿名方法。

调用阶段

当传入0个参数,进行调用时,会先调用最后一个绑定的方法。然后进行判断,如果传入参数为2个,则返回匿名方法,否则
调用old指向的上个方法。再次进入,再次进行判断,直到找到符合参数个数的方法,返回它的匿名函数。

在这里对于attr对象的绑定,其实是进行了三次绑定覆盖的操作,依次进行对attr.find进行赋值,最后只保留最后一次的赋值对象。

这也是为什么在进行调用时,是从最后一次绑定的方法中开始执行的原因。对于attr.find方法被覆盖,但却没有被自动释放的原因是因为新方法的old

始终指向被覆盖的方法,所以这里产生了闭包。

 

转载于:https://www.cnblogs.com/y8932809/p/5398254.html

你可能感兴趣的文章
iOS9 HTTP请求失败
查看>>
一个开发环境遇到的问题
查看>>
Meet in the middle学习笔记
查看>>
autocad.net 利用linq获取矩形框内的块参照
查看>>
过滤动态块
查看>>
FastJSON学习
查看>>
【JavaWeb】DbUtils入门之QueryRunner
查看>>
dblink的使用
查看>>
实验报告
查看>>
linux后台运行
查看>>
(转)浅谈分布式
查看>>
Chrome扩展移植到Edge浏览器教程
查看>>
mysql分表的3种方法(转)
查看>>
eclipse格式化代码样式
查看>>
asp uploadify示例下载
查看>>
1/7 第一篇 变量的内存实质
查看>>
jQuery遮罩插件jQuery.blockUI.js简介
查看>>
MaskedTextBox控件实现输入验证
查看>>
设计模式-行为型模式-中介者模式
查看>>
mount: 192.168.70.178:/ failed, reason given by server: Permission denied 问题
查看>>