2010-02-02 2 views
20

Поддерживает ли JS две функции с одинаковым именем и разными параметрами?Помощь с параметрами JS и функциями

function f1(a, b) 
{ 
// a and b are numbers 
} 

function f1(a, b, c) 
{ 
// a is a string 
//b and c are numbers 
} 

Могу ли я использовать эту функцию JS для IE7, FF, Opera без проблем?

ответ

32

JavaScript не поддерживает то, что вы назвали бы в других языках метод перегрузки, но есть несколько обходных путей, как с помощью arguments объекта, чтобы проверить, с каким количеством аргументов функция была ссылаться:

function f1(a, b, c) { 
    if (arguments.length == 2) { 
    // f1 called with two arguments 
    } else if (arguments.length == 3) { 
    // f1 called with three arguments 
    } 
} 

Кроме того, вы можете набрать проверить свои аргументы, для числовых и строковых примитивов безопасно использовать typeof оператора:

function f1(a, b, c) { 
    if (typeof a == 'number' && typeof b == 'number') { 
    // a and b are numbers 
    } else if (typeof a == 'string' && typeof b == 'number' && 
      typeof c == 'number') { 
    // a is a string, b and c are numbers 
    } 
} 

И есть гораздо более сложные методы, как в следующей статье, которая использует преимущества некоторых JavaScript функции языка, как замыкания, функции приложения, и т.д., чтобы имитировать метод перегрузки:

7

Нет, вы не можете использовать перегрузку функций в JS.

Но вы можете объявить только версию с тремя параметрами, а затем проверить, является ли третий аргумент === undefined, и обеспечить дифференцированное поведение на этой основе.

+0

В том случае, если абонент переходит на 3-й аргумент, но его значение не определено * * этот тест потерпит неудачу. Вероятно, лучше, если функция проверяет ** arguments.length **. – NVRAM

+0

Если вызывающий абонент использует 'undefined' в качестве 3-го аргумента, я бы принял это, чтобы сообщить, что они хотели бы, чтобы функция обрабатывалась так, как будто было передано только два. Я не вижу никакой другой законной цели для передачи в 'undefined'. –

3

Нет, это не сработает, только 2-я функция будет определена на вашей странице. Here - источник.

1

Нет, вы не можете этого сделать ... если только с вами не останется только ваше последнее определение.

2

Javascript использует только функцию, определенную последним.

http://weblogs.asp.net/jgalloway/archive/2005/10/02/426345.asp х

Вам нужно будет реализовать свою собственную логику внутри функции, чтобы определить, какие параметры были переданы в.

0

Вы также можете использовать instanceof, например, с основным полиморфизмом.

Сначала нужно создать суперкласс (мяч)

// superclass 
function Ball() { 
    this.play = function() { 
     alert("Ball throw"); 
    }; 
} 

и теперь для некоторых подклассов (типов шаров)

// subclass 
function Basketball() { 
    this.play = function() { 
     alert("basketball throw"); 
    }; 
} 
// subclass 
function Soccerball() { 
    this.play = function() { 
     alert("soccer ball kick/throw"); 
     console.debug("here"); 
    }; 
} 
// subclass 
function Baseball() { 
    this.play = function() { 
     alert("strike 3 you're out"); 
     console.debug("here"); 
    }; 
} 

Дайте им функциональность мяча, иначе установить их суперкласса с помощью прототипа

// set subclass functionality 
Basketball.prototype = new Ball(); 
Soccerball.prototype = new Ball(); 
Baseball.prototype = new Ball(); 

Некоторые полиморфизм (создайте кучу шаров и играйте с ними всеми, но играйте на основе o п тип)

var bunchOfBalls = [new Baseball(), new Soccerball(), new Basketball()]; 
for (var i = 0; i < bunchOfBalls.length; i++) { 
    bunchOfBalls[i].play(); 
} 

Теперь напишем функцию, которая принимает мяч, но только нужно работать для конкретного типа шаров (мнемосхема функция перегрузки, более или менее)

//overloading dependent upon type 
function BasketbalOrBaseballOnlyPlay(aBall) { 
    if (aBall instanceof Basketball) { 
     //special basketball function 
    } 
    if (aBall instanceof Baseball) { 
     //special baseball function 
    } 

} 

Если aBall является баскетбол так что aBall = new Basketball();, то aBall instanceof Basketball вернет true для баскетбола и фальшивый для бейсбола, но верно для Ball.

Так что aBall instanceof Ball вернется, потому что баскетбол - это мяч.

See code live at http://jsfiddle.net/kLCPB/

Смежные вопросы