Module.export-ing новый экземпляр

Если я прикреплю объект к объекту module.exports в узле следующим образом:

module.exports = new Object()

будет ли каждый object = require('./Object') в моем приложении создавать новый экземпляр этого объекта или будет создаваться ссылка на один экземпляр?


person Connor Black    schedule 09.09.2013    source источник
comment
Если вам нужен новый экземпляр для каждого использования, вероятно, стоит сделать так, чтобы каждый создавал свой собственный экземпляр. module.exports = Object;, затем var Object = require('./Object'), object = new Object();.   -  person Jonathan Lonowski    schedule 09.09.2013


Ответы (2)


require() кэширует исполняемые файлы.

При первом использовании require('./Object') он запустит ваш код и поместит экспортированный объект в require.cache.
Последующие вызовы немедленно вернут кэшированный объект.

Вы можете удалить свой модуль из кеша самостоятельно или использовать геттер, но это плохие идеи.

person SLaks    schedule 09.09.2013
comment
Интересно. Мне придется изучить require.cache. Идея состоит в том, что мне потребуется этот объект во многих местах моего приложения, и я хочу сделать это таким образом, чтобы было как можно меньше накладных расходов. - person Connor Black; 09.09.2013
comment
@ConnorBlack, может быть проще? Если вам нужен только один экземпляр, может быть достаточно литерала объекта: module.exports = { ... } - person hurrymaplelad; 09.09.2013
comment
Спасибо, мне нравится этот синтаксис - person Connor Black; 09.09.2013

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

person hurrymaplelad    schedule 09.09.2013