Как ссылаться на метод объекта в другом методе объекта - PullRequest
0 голосов
/ 28 мая 2011

У меня базовый недостаток в понимании ООП для javascript.Что я понимаю, так это то, что я могу сделать классы, подобные этому

var Car = function(){}

Car.prototype.GetBrand = function(){ return "Ford";}
Car.prototype.GetYear = function(){ return "1989";}

var ford = new Car();

ford.GetBrand();
ford.GetYear();

, это работает ... Теперь я хочу реализовать функцию GetInfo, и это должно распечатать Brand & Date

как мнессылаться на методы GetBrand () и GetYear () в моем методе GetInfo ().

  This is not working:
Car.prototype.GetInfo = function(){ 
        return this.GetBrand()+ ' '+ this.GetYear();
    }

это неправильный метод доступа ... Что мне здесь не хватает?

OK edit:это был упрощенный пример, где мой настоящий вызов метода находится в другой функции, и поэтому мы говорим о другой области:

JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
$.ajax({
    url: url,
    dataType: 'json',
    success: function(data) {
        this.ShowItems(data,template,tagToAppend); 
        }
    });
}

Я пытаюсь достичь моего метода ShowItems ... здесь, и это снова вфункция, может быть, поэтому этот оператор не работает ... извините за путаницу = /

Ответы [ 4 ]

2 голосов
/ 28 мая 2011

Вы пропустили непреднамеренную рекурсию:

Car.prototype.GetInfo = function (){  
  return this.GetBrand()+ ' '+ this.GetYear(); // instead of GetInfo() !
}

Затем вы можете позвонить

ford.GetInfo() // returns "Ford 1989"

РЕДАКТИРОВАТЬ: причина использования prototype здесь для сохранения памяти.Когда вы вызываете new Car(), объект копируется, а не «создается» в традиционном смысле.Вызов new on

var Car = function(){
  this.GetBrand = function(){ return "Ford";}
  this.GetYear = function(){ return "1989";}
}

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

Также обратите внимание, что соглашение заключается в том, чтобы вводить заглавные первые буквы только функциям-конструкторам, поэтому Car хорошо, но GetInfo должен быть getInfo.


JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
  var self = this;
  $.ajax({
    url: url,
    dataType: 'json',
    success: function(data) {
      self.ShowItems(data,template,tagToAppend); 
      }
    });
  }
}
1 голос
/ 28 мая 2011

Вы вызываете GetInfo из его определения;естественно, это не сработает:

Car.prototype.GetInfo = function(){ 
        return this.GetBrand()+ ' '+ this.GetInfo(); //note GetInfo here
    }

Я полагаю, что вы хотите:

Car.prototype.GetInfo = function(){ 
            return this.GetBrand()+ ' '+ this.GetYear(); //note GetYear here
        }

... тогда просто позвоните с ford.GetInfo()

0 голосов
/ 28 мая 2011

this зависит от контекста того, как вызывается эта функция.

Вы пытаетесь использовать this с момента вызова foo.GetJsonAndMerge, но вы не используете его в GetJsonAndMerge.Вы используете его в анонимной функции, которая вызывается $.ajax.

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

JsonLoader.prototype.GetJsonAndMerge = function(url,template,tagToAppend){
    var that = this; // COPY THIS
    $.ajax({
        url: url,
        dataType: 'json',
        success: function(data) {
            // USE THE COPY YOU PLACED IN THAT INSTEAD OF THIS
            that.ShowItems(data,template,tagToAppend); 
        }
    });
}
0 голосов
/ 28 мая 2011

Вы звоните GetInfo рекурсивно.

Вы, вероятно, имеете в виду:

return this.GetBrand()+ ' '+ this.GetYear();
//                                   ^^^^

Что отлично работает.

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