Очень основная проблема конструкторов Javascript - PullRequest
2 голосов
/ 13 апреля 2010

В следующем коде JavaScript вызывается main (). У меня вопрос, почему второй конструктор называется, а не первый? Что мне здесь не хватает?

Спасибо !!

function AllInputs() {
   alert("cons 1");
   this.radioInputs = [];
   alert(this);
}

function AllInputs(radioElement) {
   alert("cons 2");
   this.radioInputs = [radioElement];
   alert(this);
}

AllInputs.prototype.toString = function() {
   return "[object AllInputs: radioInputs: " + this.radioInputs.length + "]";
}

function main() {
   var result = new AllInputs();
}

Ответы [ 3 ]

7 голосов
/ 13 апреля 2010

Javascript не поддерживает перегруженные функции.

Когда вы определяете одну и ту же функцию дважды, второе определение заменяет первое.

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

Например:

function AllInputs(radioElement) {
   this.radioInputs = arguments.length ? [radioElement] : [];
   alert(this);
}
1 голос
/ 13 апреля 2010

В JavaScript используется последнее определение идентификатора:

function foo() { return "bar"; }
var foo = "foo";

alert(foo);

В этом случае foo была переменной со значением "foo". Если бы foo была функцией, она бы просто сказала, что foo была функцией. Если вы не верите этому, попробуйте использовать alert(foo()) вместо alert(foo). Скорее всего, вы получите сообщение об ошибке в журнале консоли без видимого вывода, как это было с alert(foo) (переменная ... не вызов функции).

0 голосов
/ 13 апреля 2010
function foo() { ... }

- это просто сокращение для

var foo = function () { ... }

Следовательно, во второй раз, когда вы объявляете функцию, вы перезаписываете переменную AllInputs другой функцией. В Javascript нет такой вещи, как две функции с одинаковыми именами, поскольку все функции действительно переменные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...