2016-08-02 6 views
0

Я хочу, чтобы экспортировать переменную кода выглядит следующим образом:Как я могу экспортировать функционально переменная

let url = ''; 
module.exports = Object.freeze({ 
    url: url 
}); 

Я хотел бы иметь возможность редактировать свойства, что оно может быть доступы к точке.

ObjectWhichHasAboveCode.url = "http://help.me" 

Могу ли я достичь его любым функциональным способом? Переопределить оператор назначения?

Я пробовал;

1) url:() => url 
2) url: { 
    value: url, 
    writable: true 
    } 

Можно ли это как-то добиться?

Второй вопрос:

Можно ли смешивать экспортирующие методы Object.freeze вместе с переменной пусть?

[EDIT] Синтаксическая ошибка

+2

Почему вы замораживание объекта, если вы хотите, чтобы это были изменчивы? Кстати, у вашего объекта literal есть синтаксические ошибки. – plalx

+2

@plalx Я не вижу никакой синтаксической ошибки в инициализаторе объекта. – Oriol

+0

Для каждого присваивания я хочу иметь новую переменную. Я просто спрашиваю, что это возможно. Я не хочу использовать глобальные переменные. Я хочу быть как можно ближе к функциональному языку. Но, к сожалению, код, от которого зависит мой код, требует доступа к такому значению. Они обращаются к нему просто по точкам. – Myrthan

ответ

0

Если я правильно понял, что вы ищете шаблон модуля. Вы хотите, чтобы реализация метода была заморожена на объекте, но вы не хотите, чтобы состояние объекта было полностью неизменным.

Вот что можно сделать:

module.exports = (function() { 
    var url; 

    return Object.freeze({ 
    get url() { return url; }, 
    setUrl: function (value) { url = value; } 
    }); 

})(); 

URL-адрес должен быть установлен с помощью theObject.setUrl('some url'), но и все остальные члены были бы неизменны. Доступ к url можно получить с помощью точечной нотации (theObject.url).

EDIT:

На самом деле, то, что вы ищете Object.seal.

module.exports = (function() { 
    var url; 

    return Object.seal({ 
    get url() { return url; }, 
    set url(value) { url = value; } 
    }); 

})(); 
+0

Да, точно. Это почти то, что я хочу. НО здесь вам нужно использовать setUrl для установки этого параметра. Вот как я все настраиваю в своем проекте, но, как я уже говорил. Есть код, который использует мой кусок кода. Они устанавливают параметр url с помощью оператора «=». – Myrthan

+0

Это звучит странно ... Мне просто нужно отказаться и просто создать редактируемое свойство: D – Myrthan

+0

@Myrthan Вы можете определить всех членов, используя 'Object.defineProperties' и настроить их как незаписываемые и неконфигурируемые. Это позволит вам использовать точечную нотацию, сохраняя неизменность существующих аксессуаров/методов. Однако новые объекты могут быть добавлены в объект, так как объект не будет полностью заморожен. – plalx

0

Печать объекта вместо того, чтобы его замораживания:

Метод Object.seal() герметизирует объект, предотвращая новые свойства от добавления к ней и маркировка все существующие свойства, как , не настраивается. Значения текущих свойств все еще могут быть изменены как долго, поскольку они доступны для записи.

module.exports = Object.seal({url}); 
Смежные вопросы