资讯专栏INFORMATION COLUMN

JavaScript之模拟函数重载

chenjiang3 / 2591人阅读

摘要:背景高级程序设计中提及,不支持函数重载。若出现函数名称相同情况下,后者覆盖前者,故此不会出现重载的情况。维基百科场景例如,一个工厂有着数量级的员工,期望通过姓名找到某一员工或某类员工,使用同一个方法通过透传参数个数去查找员工。

背景
       《JavaScript高级程序设计》中提及,JavaScript 不支持函数重载。若出现函数名称相同情况下,后者覆盖前者,故此不会出现重载的情况。

函数重载
       函数重载(英语:function overloading),是Ada、C++、C#、D和Java等编程语言中具有的一项特性,这项特性允许创建数项名称相同但输入输出类型或个数不同的子程序,它可以简单地称为一个多带带功能可以执行多项任务的能力。[[维基百科]](https://zh.wikipedia.org/wiki...

场景
       例如,一个工厂有着数量级的员工,期望通过姓名找到某一员工或某类员工,使用同一个方法通过透传参数个数去查找员工。
一般实现:
var people = {arguments 和 switch
    names: ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
};

// 找全员工
function find() {
    return people.names;
}

// 全量员工中,找到名字中带有特殊”字“的员工
function find1(name) {
    return people.names.filter(item => item.includes(name));
}

// 全量员工中,找到名字中带有多个特殊"字"的员工
function find2(name1, name2) {
    return people.names.filter(item => item.includes(name1) && item.includes(name2));
}

find(); // ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
find1("张"); // ["张一", "张二", "张三"]
find2("李", "四") // ["李四"]
函数重载,第一种方式:使用 arguments + switch
var people = {
    names: ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
};

// arguments + switch方式
people.find() {
    switch(arguments.length) {
        case: 0
            return this.names;
        case: 1
            return this.names.filter(item => item.includes(arguments[0]));    
        case: 2
            return this.names.filter(item => item.includes(arguments[1]) && item.includes(arguments[2]));
    }
}

people.find(); // ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
people.find("张"); // ["张一", "张二", "张三"]
people.find("李", "四") // ["李四"]

函数重载,第二种方式:使用 arguments + 闭包
var people = {
    names: ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
};

// 找全员工
function find() {
    return this.names;
}

// 全量员工中,找到名字中带有特殊”字“的员工
function find1(name) {
    return this.names.filter(item => item.includes(name));
}

// 全量员工中,找到名字中带有多个特殊"字"的员工
function find2(name1, name2) {
    return this.names.filter(item => item.includes(name1) && item.includes(name2));
}

// 全量员工的前 count 名
function find3(count) {
    return this.names.slice(0, count)
}

// arguments + 闭包 方式
function addMethod(obj, name, fn) {
    var old = obj[name]; // 保存着上一次的添加方法
    obj[name] = function() { // 重写obj[name]方法
        var isNumber = typeof arguments[0] === "number";
        var isEqual = arguments.length === fn.length;
        // 这里还可以编写你想要的条件,就例如isNumber
        if(isNumber || isEqual){ // 根据透传的参数length与fn方法预期的参数length一直,则执行
            return fn.apply(this, arguments);
        } else if(typeof old === "function") { // 否则且old类型为function,继续根据闭包链去找
            return old.apply(this, arguments);
        }
    }
}

addMethod(people, "find", find);
addMethod(people, "find", find1);
addMethod(people, "find", find2);
addMethod(people, "find", find3);

people.find(); // ["张一", "张二", "张三", "张四", "李一", "李二", "李三", "李四"]
people.find("张"); // ["张一", "张二", "张三"]
people.find("李", "四") // ["李四"]
people.find(3) // ["张一", "张二", "张三"]

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106747.html

相关文章

  • JavaScript】面向对象Function类型

    摘要:一类型概述与函数函数声明方式字面量方式判断函数是否为类型中所有函数都是类型的对象创建类型的对象是个函数函数名参数函数体由于函数的参数和函数体都是以字符串形式传递给以函数方式进行调用属性定义一个构造函数犬夜叉使用构造函数创建对象对象具有与构 JS(JavaScript) 一.Function类型概述1.Function与函数; // 函数声明方式 function fun(){ ...

    mingde 评论0 收藏0
  • JavaScript中的Function类型

    摘要:结果为结果为不过,提供了对象,该对象可以模拟函数重载的现象。默认名字的函数被称之为匿名函数。提供专门的读写变量的函数避免全局污染闭包的应用利用闭包保护共享的局部变量,提供专门的读写变量的函数 Function与函数 函数是一段JavaScript代码,它只定义一次,但可能被执行或调用多次Function类型是JavaScript提供的引用类型之一,通过Function类型创建Funct...

    derek_334892 评论0 收藏0
  • JavaScript 面向对象 [ Function类型 ]

    摘要:类型描述在中的所有函数都是类型的对象定义函数的方式函数声明方式函数名函数体函数声明方式定义函数函数声明方式显示函数声明方式字面量方式函数名函数体字面量方式定义函数字面量方式显示字面量方式构造函数方式函数名参数,函数体函数的参数和函数体,都以 Function类型 描述 在JavaScript中的所有函数都是Function类型的对象 定义函数的方式 函数声明方式 function 函数...

    AprilJ 评论0 收藏0
  • JavaScript...Function类型...

    摘要:类型与函数函数是这样一段代码它只定义一次但可能被执行或调用多次类型是提供的引用类型之一通过类型创建对象在中函数也是以对象的形式存在的每个函数都是一个对象函数名本质就是一个变量名是指向某个对象的引用函数声明方式字面量方式判断函数是否为类型的中 Function类型 Function与函数 函数是这样一段JavaScript代码 它只定义一次 但可能被执行或调用多次Function类型是J...

    Eirunye 评论0 收藏0
  • Javascript重温OOP面向对象

    摘要:类的继承建立继承关系修改的指向调用父类方法调用父类的构造器调用父类上的方法封装命名空间是没有命名空间的,因此可以用对象模拟。参考资料面向对象 面向对象程序设计(Object-oriented programming,OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。——维基百...

    AbnerMing 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<