1

ブラウザーと nodejs サーバーの間で共有される js コードを実行しようとしています。そのために、私は次のプラクティスを使用します: http://caolanmcmahon.com/posts/writing_for_node_and_the_browser/

問題は、オブジェクトではなく関数をエクスポートする場合です。ノードでは、次のようなことができます:

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

require を使用すると、次のことができるようになります。

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

問題は、モジュール内の module.exports オブジェクトを参照し、その参照を使用して関数で上書きしようとしたときです。モジュールでは、次のようになります。

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

なぜこれが機能しないのですか?簡単な解決策を使用して、きれいなコード内に if を挿入したくありませんが、 reference===module.exports が true であるにもかかわらず、なぜそれが違法なのかを理解したいのです。

ありがとう

4

1 に答える 1

2

を指していないため、reference機能しませmodule.exports。次のオブジェクトmodule.exportsを指しています。

module.exports
              \ 
                -> object
              / 
     reference

に新しい値を代入するときは、何を指すかではなく、何を指すかをreference変更するだけです。referencemodule.exports

module.exports
              \ 
                -> object

reference -> function

簡単な例を次に示します。

var a = 0;
var b = a;

ここで、 を設定すると、 に新しい値を割り当てたので、b = 1の値は のaままです。の値には影響しません。0ba

reference===module.exports が true なのになぜ違法なのか知りたい

違法ではありません。これが JavaScript (および他のほとんどの言語) のしくみです。reference === module.exportsこれは、代入前に両方が同じオブジェクトを参照しているためです。割り当て後、referencesは とは異なるオブジェクトを参照しますmodules.export

于 2013-03-24T18:58:56.247 に答える