如何在javascript中重载?

时间:2015-05-03 00:13:39

标签: javascript overloading

我正在尝试学习javascript中的重载。我用谷歌搜索它,有一种方法可以使用arguments长度然后通过添加切换条件来实现。但我对这样做并不感兴趣。其实我看到了一个很好的答案 Function overloading in Javascript - Best practices但是他没有用他的意见给出任何超载的例子。那么,你如何在javascript中进行重载。

这是我的代码。我需要使用上述解决方案重载方法。他说这样做:http://jsfiddle.net/m84fg8ac/

function foo(a, b, opts) {

}


foo(1, 2, {"method":"add"});
foo(3, 4, {"test":"equals", "bar":"tree"});

我将如何在我的代码中实现这一目标?

function foo(a, b, opts) {

}

function foo(a) {
    console.log("one argument pass");
}

function foo(a, b) {
    console.log("two argument pass");
}

function foo(a, b, c) {
    console.log("three argument pass");
}


foo(1);
foo(1,2);
foo(1,2,3);

这里是写的 使用参数进行函数重载的最佳方法是不检查参数长度或类型;检查类型只会让你的代码变慢,你可以享受Arrays,nulls,Objects等的乐趣。 大多数开发人员所做的是将对象作为其方法的最后一个参数。这个对象可以容纳任何东西。

3 个答案:

答案 0 :(得分:1)

JavaScript在调用函数时不需要传递所有参数,因此可以实现重载:

List<Arista>

答案 1 :(得分:1)

来自http://ejohn.org/blog/javascript-method-overloading/

var namespace = {};

function addMethod(object, name, fn) {
    var old = object[name];
    object[name] = function() {
        if (fn.length === arguments.length) {
            return fn.apply(this, arguments);
        } else if (typeof old === 'function') {
            return old.apply(this, arguments);
        }
    };
}

addMethod(namespace, "foo", function (a) {
    console.log("one argument pass");
});

addMethod(namespace, "foo", function (a, b) {
    console.log("two arguments pass");
});

addMethod(namespace, "foo", function (a, b, c) {
    console.log("three argument pass");
});

namespace.foo(1);
namespace.foo(1, 2);
namespace.foo(1, 2, 3);

&#13;
&#13;
var namespace = {};

function addMethod(object, name, fn) {
    var old = object[name];
    object[name] = function() {
        if (fn.length === arguments.length) {
            return fn.apply(this, arguments);
        } else if (typeof old === 'function') {
            return old.apply(this, arguments);
        }
    };
}

addMethod(namespace, "foo", function (a) {
    document.write("one argument pass<br/>");
});

addMethod(namespace, "foo", function (a, b) {
    document.write("two arguments pass<br/>");
});

addMethod(namespace, "foo", function (a, b, c) {
    document.write("three argument pass<br/>");
});

namespace.foo(1);
namespace.foo(1, 2);
namespace.foo(1, 2, 3);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

检查arity

@ManagedBean (name="auction")
@RequestScoped
public class AuctionBean implements Serializable {
    private int money;
    //getters & setters ...
}

http://jsfiddle.net/m84fg8ac/2/