[先端]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
について説明します.