Как вызвать функции объекта внутри одного и того же объекта?

У меня есть следующий код Javascript

add_num = {
  f: function(html, num) {
    alert(this.page);
  },

  page : function() {
    return parseInt(this.gup('page'));
  },

  gup : function(name) {
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)');
    var results = regex.exec(window.location.href);
    if(results == null)
      return '';
    else
      return results[1];
  }
}

Но когда я вызываю add_num.f(), то, что я получаю из alert(), является фактическим кодом страницы. То есть, он возвращает

function() {
    return parseInt(this.gup('page'));
  }

Я ожидал числовое значение, а не код вообще.

Ответ 1

Это потому, что вам нужно вызвать функцию page:

alert(this.page());

вместо

alert(this.page);

Ответ 2

Вы предупреждаете о самой функции, а не о ее выполнении. Вы должны сделать это:

alert(this.page());

Ответ 3

Причина в том, что литерал не является функцией, поэтому не имеет (видимого) конструктора, поэтому 'this' будет ссылаться на вызывающий объект.

Конечно, это неверно, если вы используете присвоение этого литерала прототипу функции, но я предполагаю, что это не так.

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

Просто обратитесь к объекту явно, например. add_num.page().

add_num = {
  f: function(html, num) {
    alert(add_num.page());
  },

  page : function() {
    return parseInt(add_num.gup('page'));
  },

  gup : function(name) {
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]');
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)');
    var results = regex.exec(window.location.href);
    if(results == null)
      return '';
    else
      return results[1];
  }
}