exports和module.exports
/*
使用module.exports 和 仅使用 exports的区别
- require方能看到的只有module.exports这个对象
- 它是看不到exports对象的,而我们在编写模块时用到的exports对象实际上只是对module.exports的引用
//
实际使用发现: module.exports 和 exports并没有指向同一个对象,只能证明结论 1 是对的,2 不符— 二者都指向了不同的{} 对象????注意:module.exports 与 exports 指向同一个空对象 { } - 且叫它 M。
因此我们可以直接给 exports 赋值: exports = 3.14;
但这时,exports 就失去存在意义了。因为赋值以后,它不再指向对象 M,也就无法操作 M 对象, 也就无法控制模块要导出的数据。所以上述写法是错误的,应该避免。module.exports 赋值 也是如此,下面的代码演示了该过程。
*/
> console.log(module.exports) // {}
> console.log(exports) // {}
> console.log(module.exports == exports) // true
> module.exports = {
> name:"悟能",
> age: 15,
> say: function () {
> console.log("我是猪刚鬣八戒");}
> } // 这个操作就是将module.exports指向新对象,不再是M了。
>
> // 如果上面赋值是 module.exports.name = "唐僧";
> //则export和module.exports还是指向M,console.log(exports) ---> "唐僧"
>
> console.log(module.exports) // { name: '悟能', age: 15, say: [Function: say] }
> console.log(exports) // {}
> console.log(module.exports == exports); // false,
>
> exports.name = "悟空";
> exports.age = 12;
> exports.say = function () {
> console.log("我是信哲悟空"); }
>
> console.log(module.exports) // { name: '悟能', age: 15, say: [Function:say] }
> console.log(exports) // { name: '悟空', age: 12, say: [Function(anonymous)] }
>
> var expor = module.exports;
> expor.name = "我改了名字";
> console.log(module.exports); // ”我改了名字“
> console.log(module.exports == expor) // true