[先端]exportとmodule.exportsの違い


exports module.exportsの関係をよりよく理解するために、まずjsの基礎を補います.例:
app.js
var a = {name: 'nswbmw 1'}; var b = a; console.log(a); console.log(b); b.name = 'nswbmw 2'; console.log(a); console.log(b); var b = {name: 'nswbmw 3'}; console.log(a); console.log(b);
アプリ.jsを実行した結果:
D:\>node app { name: 'nswbmw 1' } { name: 'nswbmw 1' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 2' } { name: 'nswbmw 3' } D:\>
aはオブジェクトであり、bはaに対する参照であり、aとbは同じオブジェクト、つまりaとbは同じブロックのメモリアドレスを指すので、前の二つの出力は同じです.bを修正すると、つまりaとbは同じメモリアドレスを指す内容が変更されたので、aも体現しているので、第三四の出力は同じです.bを完全にカバーすると、bは新しいメモリアドレスを指しています(元のメモリブロックを修正していません).aは元のメモリブロックを指しています.つまり、aとbはもう同じメモリを指していません.つまり、aとbはもう関係がないので、最後の二つの出力は違っています.
上記の例が分かりましたら、本題に入ります.私たちは3時を知るだけで、 exports module.exportsの違いが分かります.exports はい、指します  module.exports の引用module.exports 初期値は空のオブジェクトです.  {}です.ですから  exports 初期値も  {} require() 帰るのは  module.exports ではなく  exports だから:
 var name = 'nswbmw'; exports.name = name; exports.sayName = function() { console.log(name); }
を通して exportsに値を与えます.実は module.exportsという空のオブジェクトに二つの属性を追加しました.上のコードは
 var name = 'nswbmw'; module.exports.name = name; module.exports.sayName = function() { console.log(name); }
に相当します.
私たちは通常、 exports module.exportsの簡単な例を用いて、円の面積を計算します.exportap.js
 var circle = require('./circle'); console.log(circle.area(4));
circle.js
 exports.area = function(r) { return r * r * Math.PI; }
を使ってmodule.exportap.js
 var area = require('./area'); console.log(area(4));
ara.js
 module.exports = function(r) { return r * r * Math.PI; }
の上の二つの例を使って出力します.なぜこのように書かないのですか?app.js
 var area = require('./area'); console.log(area(4));
ara.js
 exports = function(r) { return r * r * Math.PI; }
が上記の例を実行するとエラーが発生します.これは、前の例では exportsに属性を追加することによって、 exportsに指し示すメモリだけが修正され、
 exports = function(r) { return r * r * Math.PI; }
は実は exportsをカバーしています.つまり、 exportsは新しいメモリのブロックを指しています.つまり exports module.exportsは同じメモリを指しなくなります.つまり exports module.exportsは無関係です.つまり module.exportsが指すメモリは何の変化もしていません.依然として空のオブジェクト {}です.つまり、ara.jsは空のオブジェクトを導出しています.だから、ap.jsでアリーナを呼び出します. TypeError: object is not a functionのエラーを報告します.したがって、モジュールに導出してもらいたいのがオブジェクトである場合には、 exportsおよび module.exportsは使用可能である(ただし、 exportsは新たなオブジェクトとしても上書きできない)が、オブジェクト以外のインターフェースを導き出すには、 module.exportsをカバーするしかない.私たちはよくこのような書き方を見ます.
 exports = module.exports = somethings
の上のコードは
 module.exports = somethings exports = module.exports
に相当する理由も簡単です. module.exports = somethings module.exportsをカバーしています. module.exports exportsの関係が壊れて、module.exportsは新しいメモリブロックを指しています.exportsは元のメモリブロックを指しています. module.exports exportsを同じブロックのメモリを指しているか、または同じ「オブジェクト」を指しているかを確認するために、 exports = module.exportsについて説明します.