細說一:
exports和module.exports的做用都是把文件模塊裏的方法和屬性暴露給require返回的對象(模塊對象)進行調用。可是,二者之間存在着本質區別,exports的屬性和方法均可以被module.exports替代。例以下面代碼:數組
export.myName = 'Pandora_Galen'; 和 module.exports.myName = 'Pandora_Galen'; // 做用是同樣的
1
可是,exports不能替代module.exports方法,能夠被理解爲包含關係。app
全部的exports對象最終都是經過module.exports傳遞執行的。所以,能夠說exports是給module.exports添加屬性和方法(我有時在想,exports可不能夠被看作是對module.exports的一個引用)。下面的代碼是用來驗證咱們在這裏的說法的:函數
exports.name = 'a'; // 暴露name屬性
exports.happy = function () { // 暴露happy方法
console.log('mm');
};
console.log( module.exports ); // 打印module.exports對象
1
2
3
4
5
執行後輸出:ui
{ name: 'a', happy: [Function] }
1
從結果上看module.exports至關於require所返回的對象。也就是說全部require返回的對象實質上和module.exports對象是相同的。.net
細說二:
module.exports方法還能夠單獨返回一個數據類型,而exports返回的只能是一個對象。對象
因此,當咱們須要返回一個數組、字符串、數字等類型時,就必須使用module.exports了。blog
細說三:
當使用了module.exports關鍵詞之後,該模塊中的全部exports對象執行的屬性和方法都將被忽略。例以下面代碼片斷test.js(文件模塊名):接口
module.exports = ' test for module.exports ignore! '; // 返回一個字符串
exports.name = 'Galen';字符串
/* 定義getName函數,並暴露給外部接口 */
exports.getName = function() {
console.log('My name is Galen');
};get
console.log( module.exports ); // 打印module.exports對象
1
2
3
4
5
6
7
8
9
建立執行上面文件模塊的執行文件app.js , 代碼以下:
var Book = require('./test.js');
console.log( Book );
console.log( Book.name );
console.log( Book.getName() );
1
2
3
4
運行app.jswen文件,執行結果以下:
test for modules.exports ignore! // 由打印console.log( module.exports)而來test for modules.exports ignore! // 由打印console.log( Book )而來undefined // 由打印console.log( Book.name )而來--------------------- 做者:Dragon_GL 來源:CSDN 原文:https://blog.csdn.net/u014695532/article/details/51154295 版權聲明:本文爲博主原創文章,轉載請附上博文連接!