如何在JavaScript/jQuery中实现重载?
我试图调用具有相同签名的函数 示例:有两个同名函数:如何在JavaScript/jQuery中实现重载?,javascript,oop,dom-events,Javascript,Oop,Dom Events,我试图调用具有相同签名的函数 示例:有两个同名函数: <script> var obj1,obj2,obj3,obj4,obj5; function OpenBox(obj1,obj2){ // code } function OpenBox(obj1,obj2,obj3,obj4,obj5){ // code } </script> 变量obj1、obj2、obj3、obj4、obj5; 功能打开框(obj1、
<script>
var obj1,obj2,obj3,obj4,obj5;
function OpenBox(obj1,obj2){
// code
}
function OpenBox(obj1,obj2,obj3,obj4,obj5){
// code
}
</script>
变量obj1、obj2、obj3、obj4、obj5;
功能打开框(obj1、obj2){
//代码
}
功能打开框(obj1、obj2、obj3、obj4、obj5){
//代码
}
当我在链接的click事件上调用函数时
<a id='hlnk1' href='#' onclick='OpenBox(this,\"abhishek\"); return false;'> Open Box </a>
当我点击上面的链接时,它正在调用函数OpenBox(obj1、obj2、obj3、obj4、obj5){
它应该是调用函数OpenBox(obj1,obj2){}
函数出了什么问题?javascript不能在同一范围内定义重复的函数。检查是2还是5。马特的想法是正确的。因为javascript没有类型,所以这些函数是等价的。你可以这样做:
function OpenBox_impl1(obj1,obj2){
// code
}
function OpenBox_impl2(obj1,obj2,obj3,obj4,obj5){
// code
}
function OpenBox(obj1, obj2, obj3, obj4, obj5) {
if(arguments.length == 2)
return OpenBox_impl1(obj1, obj2);
else
return OpenBox_impl2(obj1,obj2,obj3,obj4,obj5);
}
@阿布希克
没有什么能像c#或java那样。JavaScript的行为是这样的
function Test(arg1 ,arg2 , arg3, arg4)
{
}
调用此函数时,可以通过以下方式调用
Test(arg1);
Test(arg1,arg2);
Test(arg1,arg2,arg3);
Test(arg1,arg2,arg3,arg4);
但是顺序很重要,所以您可以通过上述方法来调用函数。您不能在JavaScript中重载函数。相反,将使用函数的最新定义版本,这就是为什么在您的示例中会调用带有5个参数的版本(最后3个参数只是
未定义的)
有几种方法可以解决这个问题,其中一种方法在米科拉的回答中有所体现。另一种方法是传入一个对象,然后在函数中检查该对象的内容(请参阅):
另一个选项是检查参数。长度:
function foo(a, b) {
if(arguments.length > 2) {
var arg3 = arguments[3];
//etc...
}
}
问题是您试图重载一个函数,但Javascript不支持。我认为最好的选择是使用多态性。查看本文了解更多详细信息:在ecmascript中定义函数后,该名称将被锁定。但是,您可以向该函数传递任意数量的参数,以便在内部完成其余工作
function foo(arg1, arg2) {
// any code that is needed regardless of param count
if(arg2 !== undefined) {
// run function with both arguments
console.log(arguments);
} else if(arg1 !== undefined) {
// run function with one argument
} else {
// run function with no arguments
}
}
foo(1);
foo(1,2);
foo(1,2,3);
有趣的注意:您可以传入函数声明中没有的额外参数。做一个控制台。记录参数
,你会看到里面的一切arguments
是一个对象
,可以像访问数组一样进行类型转换
在多态性中,您可以使用不同的签名方法,在javascript中,我们可以模拟多态性检查函数参数的类型并执行特定任务
var input = document.getElementById('data');
polymorphism(input);
polymorphism('Hello word 2');
polymorphism('hello word 3', 5);
function polymorphism(arg,arg1){
var string = null;
var sqr = 0;
if(typeof arg === 'string'){
string = 'arg type String: \n'+arg;
}else if (arg.tagName && arg.tagName === 'INPUT'){
string = 'arg type Input: \n'+arg.value;
}
if(arg1 && typeof arg1 === 'number'){
sqr = arg1*arg1;
alert(string + ' and sqr = '+sqr);
}else {
alert(string);
}
}
在'OpenBox(这个,\'abhishek\')中选中此示例,返回false;'
应该是'OpenBox(这个“阿披舍克”)返回false;'代码>阅读这个问题的答案:@lbu-避开引号,虽然在这种情况下不是必需的,但实际上并不有害,是吗?我更关心的是,在结束括号和返回之间没有分号。我只想指出,对于阅读这个问题作为搜索的一部分的人来说,阿披舍克所描述的是方法重载,而不是多态性。多态性是遵守特定接口或契约的能力。Javascript是一种鸭子类型的语言,具有隐含多态性。@Randolpho感谢您对其进行了很好的描述。感谢@Joe_Francis的回复。是的,Jackson是的。。我可以通过arguments对象访问所有参数吗?您也可以在没有参数或5+参数的情况下调用它。
var input = document.getElementById('data');
polymorphism(input);
polymorphism('Hello word 2');
polymorphism('hello word 3', 5);
function polymorphism(arg,arg1){
var string = null;
var sqr = 0;
if(typeof arg === 'string'){
string = 'arg type String: \n'+arg;
}else if (arg.tagName && arg.tagName === 'INPUT'){
string = 'arg type Input: \n'+arg.value;
}
if(arg1 && typeof arg1 === 'number'){
sqr = arg1*arg1;
alert(string + ' and sqr = '+sqr);
}else {
alert(string);
}
}