Проблема с функцией прототипа (Обновлено!) - PullRequest
0 голосов
/ 18 апреля 2011

Я определил функцию:

var Test = function(){

};

Test.prototype={

   getColor: function(){
         return "red";
   },

   createCar: function(){
      var color = this.getColor(); //ERROR: this.getColor is not a function
      ...
   },

   getCar: function(){
      return new CarFactory(1, this.createCar);
   }

}

Как вы видели, я определил три * прототип * функций: getColor () , createCar () и getCar () .

Внутри createCar () функция, которую я вызвал getColor () ,

В функции getCar () я использую this.createCar как парапетер конструктора CarFactory . Я получил ошибку " this.getColor не является функцией " в указанном выше месте, почему эта ошибка ?? Как избавиться от этой ошибки?

Ответы [ 3 ]

3 голосов
/ 18 апреля 2011

Я думаю, что вы, возможно, не делаете объект Test и вызываете его должным образом.Я вставил ваш фрагмент в тестовую страницу, затем добавил:

var obj = new Test();
console.log(obj.getColor());
// Outputs 'red'
obj.createCar();
// Does not throw an error. 

Замена ... на console.log(color); показала правильный результат «красный» в моем тесте.

http://jsfiddle.net/2F5zz

0 голосов
/ 19 апреля 2011

Потому что с this.createCar в качестве обратного вызова вы передаете только функцию без ее контекста.

Попробуйте изменить свой код следующим образом:

   getCar: function(){
      var that = this;
      return new CarFactory(1, function() {
            return that.createCar();
      });
   }

Или просто передайте экземпляр Test в CarFactory и передайте ему вызов createCar: P

0 голосов
/ 18 апреля 2011

Если вы правильно создали Test.Как это:

var test = new Test();
test.createCar(); 

Вы не получите эту ошибку.Мне кажется, что вы пытаетесь вызвать createCar так:

Test.createCar();

Когда вы определяете прототипы, вы определяете элементы, которые будут скопированы в любой экземпляр этого типа / функции.В вашем случае вы определяете, что каждый экземпляр Test будет иметь 2 функции, getColor и createCar.Таким образом, эти функции не входят в область тестирования.Они входят в сферу экземпляров Test.Вы создаете экземпляры с помощью клавиш new

...