2016-03-09 2 views
-1

Я пытаюсь понять, как я могу организовать свои переменные, и это результат я хочу:Javascript рекурсивный JSON decleration (ES6)

settings.txt.token => 'txt' 
settings.txt.path => '/txt/' 

Это, очевидно, очень простой пример, но я хочу settings.txt.path зависит от settings.txt.token. Таким образом, судо-отказ будет:

export var txt = { 
    token: 'txt', 
    path: '/' + token + '/' 
}; 

Есть ли хороший способ сделать это? Обратите внимание, что я использую ES6.

+2

Это не JSON, это только JavaScript. – zero298

ответ

1

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

Один с геттером:

export var txt = { 
    token: 'txt', 
    get path() { return '/' + this.token + '/';} 
}; 

Другим просто добавить свойство объекта после статической декларации завершена:

export var txt = { 
    token: 'txt', 
}; 
txt.path = '/' + txt.token + '/'; 

Опции геттера имеет то преимущество, что если .token, последующие запросы для .path автоматически отражают новое значение .token. Второй вариант не связан динамически. Значение txt.path не будет автоматически изменяться, если изменяется txt.token. Вы можете выбрать либо поведение.

+0

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

+0

@ Бармар - Может быть, может и нет - не уверен. Я предложил оба варианта. – jfriend00

0

Да, вы не можете ссылаться на поля в инициализаторе объектов. Но вы можете в конструкторе:

export var txt = new function(){ 
    this.token = "txt"; 
    this.path = "/" + this.token + "/"; 
} 
Смежные вопросы