これが機能する理由は何ですか:
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'}
これが機能する理由は何ですか:
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'}
私は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
に置き換えることexports = data;
で、2番目のコードを修正できますmodule.exports = data;
。
前者が機能しない理由はexports
、モジュールの名前空間内の別のオブジェクトにのみ割り当てるためです。exports
後者はオブジェクトのプロパティの値をmodule
オブジェクトに置き換えdata
ます。
2番目のコードでは、基本的にエクスポートオブジェクトを上書きしています。したがって、コードが機能したとしても、他のすべてのエクスポートはこれによって破棄(上書き)されると思います。したがって、ノードにはそのような場合を回避するための保護メカニズムがあるかもしれません