2015-01-30 2 views
0

Я пытаюсь построить многоразовый Database класс с прототипическими методами для добавления элементов в собственность list массива класса:Изменения экземпляра свойства от способа-прототипа

var Database = function() { 
     this.list = []; 
    } 

    Database.prototype = { 
     getBooks: function() { 
      $.get("//some.url/books") 
      .success(function(res) { 
       _.each(res,function(book) { 
        this.list.push({ 
         name: book.name, 
         url: book.url, 
         type: "book" 
        }) 
       }) 
      }); 
     } 
    } 

Однако, в настоящее время я получаю предупреждение о том, что я не могу нажмите на неопределенное свойство list, и я могу только предположить, что я на самом деле не .push ing для любого свойства экземпляра класса Database, а скорее для свойства prototype.

Итак, вопрос повторен: Как использовать метод прототипа для изменения свойств экземпляра?

+0

Я понимаю, что это немного дублируют в ответ, но я не мог обернуть моя голова вокруг довольно длинных/абстрактных ответов уже предоставлена ​​на StackOverflow/в другом месте. Ответ принят простым и точным. –

ответ

1

Вы можете сохранить ссылку на this в переменной, как этот

Database.prototype = { 
     getBooks: function() { 
      var _this = this; 
      $.get("//some.url/books") 
      .success(function(res) { 
       _.each(res,function(book) { 
        _this.list.push({ 
         name: book.name, 
         url: book.url, 
         type: "book" 
        }) 
       }) 
      }); 
     } 
    } 
+0

Почему 'this' работает в области' getBooks', но не дальше вложенные функции? Это потому, что 'this' тогда ссылается на успех/_. Каждый обратный вызов? –

+0

@ J.B. да, потому что в _.это это относится к другой области, а не к Database.prototype –

+0

Оглядываясь назад, это кажется настолько очевидным. Огромное спасибо. –

0

Что «это» относится, в зависимости от ситуации. Проверить MDN для получения более подробной информации: MDN this operator

И эта нить может помочь вам ясно понять, как пройти «это» в другой области: Stackoverflow thread

Смежные вопросы