2013-03-24 2 views
1

Я пытаюсь выполнить некоторый js-код, совместно используемый между браузером и сервером nodejs. Для этого я просто использую следующие методы: http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/Nodejs referencing module.exports

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

var Constructor = function(){/*code*/}; 
module.exports = Constructor; 

так, что, когда требуют используется вы можете сделать:

var Constructor = require('module.js'); 
var oInstance = new Constructor(); 

Проблема заключается в том, когда я пытаюсь ссылаться на module.exports объект в модуле и использования эта ссылка для перезаписи его с моей функцией. В модуле это будет:

var Constructor = function(){/*code*/}; 
var reference = module.exports; 
reference = Constructor; 

Почему это не работает? Я не хочу использовать простое решение для вставки if внутри чистого кода, но я хочу понять, почему он является незаконным, хотя ссылка === module.exports истинна.

Благодаря

ответ

2

Это не работает, потому что reference делает не пункт module.exports, он указывает на объект module.exports указывает на:

module.exports 
       \ 
       -> object 
      /
    reference 

При назначении нового значения reference, вы просто изменить то, что reference указывает на то, что не то, что module.exports указывает на:

module.exports 
       \ 
       -> object 

reference -> function 

Вот упрощенный пример:

var a = 0; 
var b = a; 

Теперь, если вы установите b = 1, то значение a все равно будет 0, так как вы просто присвоить новое значение b. Он не влияет на значение a.

я хочу понять, почему это незаконно, даже если ссылки === module.exports верно

Это не незаконным, это как JavaScript (и большинство других языков) работа. reference === module.exports истинно, потому что перед назначением оба они относятся к одному и тому же объекту. После назначения references относится к другому объекту, кроме modules.export.

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