Подтвердить что ты не робот

Помощь с параметрами 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 без проблем?

4b9b3361

Ответ 1

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
  }
}

Кроме того, вы можете ввести проверку своих аргументов, для примитивов Number и String можно использовать оператор 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, такие как закрытие, функциональное приложение и т.д., для имитации перегрузки методов:

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

Вы также можете использовать 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");
    };
}

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

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

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

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

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

//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 для баскетбола и false для бейсбола, но верно для Ball.

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

Смотрите код в прямом эфире http://jsfiddle.net/kLCPB/ p >