1

これが機能する理由は何ですか:

exports.foo = 'foo';

var bar = require('./foo');
console.log(bar); // {foo: 'foo'}

しかし、これはしません:

var data = { foo: 'foo' };
exports = data;

var bar = require('./foo');
console.log(bar); // {}
// expected {foo: 'foo'}
4

3 に答える 3

5

私はjavascriptの質問コードサンプルとしてこれに答えようとします

function a() {}
a.prototype.foo = {test:"bar"}
var d = new a();
var c = new a();
console.log(d.prototype ==== c.prototype) // Both c and d share the same prototype object
d.foo.hai = "hello"
console.log(d.prototype ==== c.prototype) // Still the they refer to the same
d.foo = {im: "sorry"}
console.log(d.prototype ==== c.prototype) // now they don't

ノードも同様

console.log(module.exports === exports);// true; They refer to the same object
exports.a = {tamil: "selvan"} 
console.log(module.exports === exports);// true even now 

exports = {sorry: "im leaving"}; // overrides modules.exports
console.log(module.exports === exports); //false now they don't
console.log(module.exports); // {a: {tamil: "selvan"}}
console.log(exports);  // {sorry: "im leaving"}

exports と module.exports は、javasacript プロトタイプ オブジェクトのようにオーバーライドするまで、同じコア オブジェクトを参照します。参照を変更した瞬間。

module.exports = {something: "works"} キャッシュ中にノードが気にするモジュールのプロパティを変更しているため、機能します。

上記についても

module.exports === exports //is false they are no more the same

これは、逆もまた真であることを証明しています:)

もう1つmoduleは、現在のモジュールへの参照であるため、常によりも使用することを好みmodule.exportsますexports

于 2012-05-08T10:27:23.313 に答える
3

に置き換えることexports = data;で、2番目のコードを修正できますmodule.exports = data;

前者が機能しない理由はexports、モジュールの名前空間内の別のオブジェクトにのみ割り当てるためです。exports後者はオブジェクトのプロパティの値をmoduleオブジェクトに置き換えdataます。

于 2012-05-08T09:26:32.997 に答える
1

2番目のコードでは、基本的にエクスポートオブジェクトを上書きしています。したがって、コードが機能したとしても、他のすべてのエクスポートはこれによって破棄(上書き)されると思います。したがって、ノードにはそのような場合を回避するための保護メカニズムがあるかもしれません

于 2012-05-08T09:24:04.137 に答える