輸出とmodule.exportsは違い
1、分析
私たちは、基本となる実装から理解することができます:ノード内の子オブジェクトの輸出は、各モジュールには独自の内部オブジェクトモジュールを持ち、モジュールオブジェクト、そこに
オブジェクトのインタフェースを取得しmodule.exportsは誰でも、ファイルを必要としたノードでは、
私たちは、module.exports.xxxずつ輸出インタフェースメンバー= XXX方法トラブルの多くことがわかって道を指し示す必要がありました。 だから、ノードの簡素化、操作するには、変数の提供を専門に:輸出= module.exportsは
すなわち、このようなAコードが存在する根本的な実装モジュールであります
VARの輸出= module.exportsは
次のようにテストがあります
2、分析の原則
輸出module.exportsはへの参照です
図3に示すように、単一のモジュールを導出します
単一のモジュールをエクスポートする場合、それはmodule.exportsはする必要があります
4、高度な思考(オブジェクト指向 - 参照型)
なぜ輸出単一のオブジェクトは、輸出= XXXを使用することはできません。輸出の直接割り当ての定義???
回路図:参照データ型
次に、質問を見て
ハローの結果、なぜ?
OBJ1への再割り当て以下に示すように、それは、新しいメモリ空間を開放し、新しいオブジェクトを指すようになります場合は、この時二人は何の関係もありません
前述の分析は直接= xxxは個々のメンバーの輸出をエクスポートするために使用することはできません
VARの輸出= module.exportsは
同様の
VAR OBJ1 = OBJ
、ここではそれへの参照のみが直接のみ、新しいオブジェクトにここに直接割り当てをエクスポートし、そしてmodule.exportsは影響を与えません、ちょうどポイント輸出をmodule.exportsは。
常に覚えている:オブジェクトの確定申告での基本となる実装がmodule.exportsはあります
図5に示すように、再割り当て、逆参照
此外,这里要注意:一旦给exports重新赋值,便会失去和module.exports的关联,指向新对象,且后期无法使用。
如下所示
6、思考2
对上述代码再次修改如下
结果如下
7、思考3
再使用module.exports添加如下
8、思考4
接下来再做下调整
原理如下:
换为exports与module.exports
重定义
这里注意:此时两者已经没有引用关系,最终return的是module.exports所以只需要看module.exports即可
9、思考5
接着修改代码
10、思考6
11、小结
1、exports为modules.exports的一个引用 2、最后node底层模块导出的是module.exports 3、底层代码 var module = { exports:{...} } 4、exports.name等价于module.exports.name,但node为了方便书写,使用module.exports导出单个成员,本质为将该子对象重新赋值
5、所以只要给exports赋值,便丢失了module.exports的引用关系,后期便不可用
.