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