2012-06-30 6 views
1

Относительно новинок к JavaScript, поэтому задайтесь вопросом, что лучше всего подходит для выполнения нижеописанного требования. Я хотел создать объект JSON (объект запроса RPC) и должен обеспечить некоторую структуру. Как я узнал, JS является динамическим языком, поэтому я могу добавлять любой тип объекта в любое время. Но мне нравится определять класс, который я могу заполнить, чтобы построить запрос JSON.Класс Javascript для обеспечения структуры JSON

var RecReq = { 
      ID:{}, 
      HeaderLevel:{}, 
      Content:{} //Content object goes here 
     }, 
     HeaderLevel = { 
      HeaderID:{}, 
      Note:{} 
     }, 
     Content = { 
      Item: [] //Array of Item goes here 
     }, 
     Item = { 
      IDs:[] 
     }; 

    function ReceiveObj() { 
     this.RecReq = RecReq, 
      this.HeaderLevel = HeaderLevel, 
      this.Content = Content, 
      this.Item = Item 
    }; 
    return new ReceiveObj(); 

Я уверен, что многие вещи не соответствуют вышеуказанному коду. Я не думаю, что объект создается с инициализированными массивами. На возвращенном объекте я не могу выполнить операцию push(), чтобы вставить iten на Content.

Как вы подходите к этому. Вы создаете объект «на лету» или лучше определяете объект, который обеспечивает определенную структуру.

+1

Я бы не стал создавать класс JS только для JSON DTO. Чаще всего вы отправляете DTO в какой-либо веб-сервис; если служба реализована на статически типизированном языке, пусть она заботится о безопасности типа. Другой подход, более подходящий для динамического языка, будет проверять структуру объектов, которые ваш код производит с помощью модульных тестов. – millimoose

+0

благодарим вас за обмен опытом. Я не буду создавать класс, но создаю объект на лету. Мое намерение состояло только в том, чтобы DOCUMENT, что весь объект «может» содержать, чтобы он не вызывал ошибку на бэкэнд. Чтобы помочь моему обучению, можете ли вы предложить, как я должен был построить DTO (по идиоматическому пути JS). Если все это должно быть в одном классе или в том, как я пытался это сделать (другая переменная указывает разные поля/типы в классе). Это кажется ужасно неправильным, поэтому пример поможет мне подумать о JS. Еще раз спасибо – bsr

+1

Чтобы документировать вещи, вы можете использовать определение на стороне сервера - если конечная точка реализована с использованием, скажем, .NET и WCF, это будет контракт с данными. (Это хороший вариант, если служба не является своего рода публичным API.) В противном случае вы можете посмотреть, как документируются основные библиотеки Javascript, которые используют шаблон «options hash»; обычно это означает «много-много примеров, описывающих фактические варианты использования». Поэтому я бы сказал, что вы не ошибетесь, просто предоставляя полный пример JSON, ожидаемого вашим сервисом, а затем документируете назначение атрибутов. – millimoose

ответ

1

Если, как указывает ваш код, вы хотите, чтобы ваши экземпляры наследовали внешний объект, одним из подходов было бы назначить прототип «класса» (будьте осторожны, думая в терминах класса в JS - это не класс в смысл Java и т. д.).

var obj = { 
    prop_1: 'foo', 
    prop_1: 'bar' 
} 
function Something() { 
    alert(this.prop_1); //alerts "foo" 
} 
Something.prototype = obj; 
var something = new Something(); 

Это только один из способов. Существует множество шаблонов для управления наследованием (и другие шаблоны, которые бы достигли того, чего вы хотите, даже не приближаясь к концепции наследования).

Что касается push() не работает, в вашем коде, Content является объектом, в то время как push() является метод Array прототипа. Другими словами, вы можете push() в массив. Возможно, вы имели в виду Content.Item, который является массивом.

И, наконец, я бы не стал использовать имена. В JavaScript это, как правило, выполняется только с функциями, которые используются в симуляции классов (например, с ReceiveObj), чтобы обозначить, что они должны быть созданы, а не просто вызваны.

+0

Благодарю вас за помощь. Цель состоит в том, чтобы не наследовать внешний объект, а указать ReceiveObj. Содержимое имеет тип (следовательно, поля могут быть установлены). Содержимое. Я знаю, что он не может быть применен в JS, поскольку кто-то может изменить тип в любое время, но все же он может быть указателем для документирования того, что все поля могут содержать ReceiveObj. О push, я хочу вызвать recObj.Content.push (anItem). Я думаю, что в моем определении массив не инициализирован. Вы правы, я думаю через другие языки ООП. – bsr

+0

Дело в том, что ваше свойство 'Content' - это объект, а не массив, поэтому он не имеет метода' push() '. Массив - это 'Content.Items', а не' Content'. В JavaScript инициализация и объявление - это один шаг, а не два, поэтому ваш массив готов к использованию после его объявления. Любое значение по умолчанию (то есть «инициализированное») - это то, что вы заполняете в момент создания (в вашем случае ничего). – Utkanos

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