new
используется для создания нового экземпляра, на основе существующего определения (которые вы храните в Add
). Вместо генерируемого экземпляра вы возвращаете функцию, поэтому она не работает так, как вы ожидали.
Эта форма должна работать:
function Add(x) {
this.counter = x;
this.addOne = function() {
return this.counter += 1;
}
}
var add = new Add(0);
function myFunction() {
document.getElementById("demo").innerHTML = add.addOne();
}
Что касается вашего вопроса о том, почему ваш код возвращается NaN
, давайте посмотрим на то, что вы делали:
function Add(x) {
this.counter = x;
return function() {return this.counter += 1;}
};
var add = new Add(0);
function myFunction(){
document.getElementById("demo").innerHTML = add();
}
Здесь вы объявляете переменную add
и инициализируйте его, используя new Add(0)
. Во-первых, функция Add
объявляет свойство в своей области с именем counter
и присваивает ему значение, переданное через параметр с именем x
(в данном случае 0). Затем он возвращает функцию. Затем он выходит, больше не требуется, и собирается мусор. Значение, присвоенное объекту counter
, отбрасывается, поскольку привязанный к нему к нему вышел из сферы действия.
Теперь у вас есть add
как указатель на функцию. Он не имеет свойства с именем counter
. Когда вы вызываете функцию add()
, она пытается добавить 1 к this.counter
. Поскольку this.counter
не определен, он автоматически имеет значение undefined
.
Если вы попытаетесь добавить число до undefined
, вы получите NaN
. Поскольку это происходит в заявлении return
, возвращается NaN
.
Спасибо за примеры. Мне очень полезно понять разницу. На самом деле я ядро программист Java. В отличие от Java, ключевое слово JavaScript «this» на самом деле запутанно! –