方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
简而言之就是:方法重载就是方法名称重复,加载参数不同。
具体看请左转:
那么 js 如何实现这个呢???
首先 javascript 是没有重载函数 / 方法这个概念的,但是 js 提供了一个 arguments 这个方法参数,通过这个参数的 length 属性就可以拿到方法参数的长度,o~ 对了,咱们今天实现的也仅仅是按照参数长度
,而不是参数类型~~·length , 那么及下载呢,一旦有了方法参数长度,于是出现了比常见的 switch 写法:
- 重载
- var seven={
- dosomething:function(){
- switch(arguments.length){
- case 0:
- console.log(arguments.length);
- //dosomething
- break;
- case 1:
- console.log(arguments.length);
- //dosomething
- break;
- case 2:
- //dosomething
- console.log(arguments.length);
- break;
- }
- }
- }
wow~ 如果 10 个方法就需要 10 个分支~ 而且很不好维护~ 因为每个方法体都在 case 下,或者单独提出来写成一个 function~
然后这些都是不好的~ 不易维护的,逼格不够高的~ 那么咱们应该如何优雅的实现对于不同参数的同一方法名的处理呢?
这就用到这个
这个方法了. 咱们为 seven 编写一个
- apply
方法
- addMethod
- var seven = {
- addMethod: function (fname, func) {
- var old = this[fname];
- this[fname] = function () {
- if (arguments.length == func.length) {
- return func.apply(this,arguments);
- }
- if (typeof old == 'function') {
- return old.apply(this, arguments);
- }
- }
- }
- };
修改后的 seven 如上,然后之前写的 switch 就可以这样搞了:
- seven.addMethod('dosomething',
- function(x) {
- console.log(arguments.length);
- //dosomething
- });
- seven.addMethod('dosomething',
- function(x, y) {
- console.log(arguments.length);
- //dosomething
- });
- seven.addMethod('dosomething',
- function(x, y, z) {
- console.log(arguments.length);
- //dosomething
- });
咱们要增加方法,只需要调用这个 addMethod 方法就 ok 了,是不是觉得简单明了,更加清晰。
那么这段代码的原理呢,其实也很简单,就是缓存旧方法,然后根据参数长度依次 apply 链式调用,直到找到和当前参数等长的方法~ 然后进行调用。
和
- func
很有可能让初来乍到的童鞋们迷惑,其实不然,这里巧妙的使用了 JavaScript 语言的特性,这个 old 每一次保存的都是上一次
- old
的引用, 而且每次都是全新的,而旧的 old 又保持着引用,这是什么呢?闭包喽~。
- 方法
来源: