2013-11-30 3 views
0

Допустим, у меня есть следующий сценарий:Конструкторы объектов внутри объекта конструкторами

var A = function() { 
    this.b = "asdf"; 
    this.c = function() { 
    this.source = "asd"; 
    this.data = function() { 
     var response; 
     $.getJSON(this.source, function(data) { 
     response = data; 
     }); 
     return response; 
    }; 
    }; 
}; 

Поэтому я сделал эти закрытия является то, что у меня есть другие объекты и переменные внутри A, что делает объектно-ориентированное приложение. У меня есть некоторые сомнения по поводу этого сценария:

  • Как бы сослаться на A.b внутри метода A.c? this относится к экземпляру A.c, а не к A.

Примечание: цель состоит в том, чтобы на new A(), генерировать объект вроде этого:

{ 
    b: "asdf", 
    c: { 
    source: "qwerty", 
    data: { 
     jsondata1: "jsonvalue1", 
     jsondata2: 3, 
     // ... 
    } 
    } 
} 

, но я знаю instance.c еще будет функция-конструктор, и я понятия не имею, как сделать его объект внутри другой.

+3

Не можете ли вы хотя бы ответить на первый вопрос, просто попробовав его? Хотя 'new A()' не будет создавать эти свойства вообще. Вам также придется вызывать 'c()' в экземпляре 'A'. –

+0

Да, извините и спасибо за это. Иногда Stack Overflow делает меня ленивым! – gchiconi

+1

Btw, прежде чем вы застрянете в следующий раз: [Как вернуть ответ от ** асинхронного вызова AJAX?] (Https://stackoverflow.com/questions/14220321/how-to-return-the-response- from-a-ajax-call) – Bergi

ответ

1

Это должно работать

var A = function() { 
    var me = this; //<-- to let you refer to b inside the c function 
    me.b = "asdf"; 
    me.c = new function() { // <-- added new here 
     this.source = me.b + 'abc'; 
     this.data = function() { 
      var response; 
      $.getJSON(this.source, function(data) { 
       response = data; 
      }); 
      return response; 
     }; 
    }; 
}; 

a = new A(); 

a.b возвращается "фыва олдж" и a.c.source возвращает "asdfabc". a.c.data все равно будет функцией.

+0

Спасибо. Именно то, что я пытался сделать. Интересно, почему мне никогда не приходило в голову, что я должен скопировать «это» в частную переменную. – gchiconi

+0

Рад, что я мог помочь. Теперь вам просто нужно сделать приватную переменную внутри c с определением функции getJSON, а затем называть ее кучей раз, чтобы заполнить ваш объект 'c.data' – tewathia

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